いくつかの列にカテゴリ値を持つデータセットがあります (1 つの行には、 で区切られた複数のカテゴリが含まれる場合があります,
)。例:
user hashtags
0 u1 a,b
1 u2 a,c
2 u3 c
これらのカテゴリにダミーの列を作成したいと思います。また、データセットにほとんど出現しないカテゴリにも興味がありません。現在、ダミーの列を生成してから、次のように出現回数の少ない列を削除しています (これchunk
は元のデータ フレームです)。
dummies_hashtags = chunk['hashtags'].str.get_dummies(sep=',')
dummies_hashtags.columns = dummies_hashtags.columns.map(lambda c: 'hashtag_' + c)
# get rid of dummy columns with usage below 10
usage = dummies_hashtags.sum(0)
high_usage = dummies_hashtags[np.where(usage >= 10)[0]]
low_usage = dummies_hashtags[np.where(usage < 10)[0]]
dummies_hashtags = high_usage
dummies_hashtags['other_hashtags'] = low_usage.sum(1)
出現率の低いカテゴリの数の列も追加していることに注意してください。
このアプローチは機能しますが、非常に低速です。それを改善する方法についての私の考えは、ダミー列を生成する前に、最初にすべての一意のカテゴリとその数を取得し、次に低い数のカテゴリを削除することです。
これについてお聞きしたいのですが、このアプローチは実際に何かを改善しますか? それはどのように実装されますか?(np.unique
とreturn_counts=True
思い浮かびます)。また、この問題に対するより良いアプローチはありますか?
(注: データセットはSparseDataFrame
すでに存在します)。
numpy
ブール値のスライスを使用すると速度が上がります.これがうまくいくかどうか教えてください。
duh = df.hashtags.str.get_dummies(',')
v = duh.values
m = v.sum(0) > 1 # filter out occurrences of 1. change for your needs
d2 = pd.DataFrame(v[:, m], duh.index, duh.columns[m])
df.join(d2)
user hashtags a c
0 u1 a,b 1 0
1 u2 a,c 1 1
2 u3 c 0 1
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加