2017-04-15 4 views
0

一部の列にカテゴリ値を持つデータセットがあります(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.uniquereturn_counts=Trueが気になります)。また、この問題に対するより良いアプローチがありますか?

(注:データセットはすでにSparseDataFrameです)。

+0

列名は何ですか?あなたが示したものは、DataFrameのようには見えません。 – Peaceful

答えて

1

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 
+0

です!だから私は、これがより速く実行するので、ダミーを生成する前にラベルを前処理することには意味がないと思います。 – chuckeles

関連する問題