2017-11-13 16 views
1

私はリストのリストとして列の1つと100万行(ids)のPandas Dataframeを持っています。例: パンダのスライスリストのリストである列に存在する値に基づくデータフレーム

df = pd.DataFrame({'id':[1,2,3,4]、 'token_list':[['a'、 'b'、 'c']、['c'

私はすべてのユニークなトークンの辞書を作成したいと思っています - 'a'、 'b'、 'c'、 'e'、 'f'(私はすでに別のリストとして持っています)を各キーが関連付けられているすべてのIDとキーとして返します。たとえば、{'a':[1,3]、 'b':[1]、 'c':[1,2,4] ..}などです。

私の問題は、そのようなトークンが12000あって、最初のフレームの各行を実行するためにループを使いたくないということです。そして、働いているようではありません。最初にしてlistと最後to_dictgroupbyを平坦化するためのnumpy.concatenate

答えて

2

使用np.repeat

a = np.repeat(df['id'], df['token_list'].str.len()) 
b = np.concatenate(df['token_list'].values) 

d = a.groupby(b).apply(list).to_dict() 
print (d) 

{'c': [1, 2, 4], 'a': [1, 3], 'b': [1], 'd': [2], 'e': [3], 'f': [3, 4]} 

は詳細:

print (a) 
0 1 
0 1 
0 1 
1 2 
1 2 
2 3 
2 3 
2 3 
3 4 
3 4 
Name: id, dtype: int64 

print (b) 
['a' 'b' 'c' 'c' 'd' 'a' 'e' 'f' 'c' 'f'] 
2
df.set_index('id')['token_list'].\ 
    apply(pd.Series).stack().reset_index(name='V').\ 
     groupby('V')['id'].apply(list).to_dict() 
Out[359]: {'a': [1, 3], 'b': [1], 'c': [1, 2, 4], 'd': [2], 'e': [3], 'f': [3, 4]} 
関連する問題