2016-12-20 6 views
3

は、私はこのようなDFを持って繰り返した場合の値のリストを持つ新しい列:パンダDF操作:他の列の行は

ID Cluster Product 
1   4  'b' 
1   4  'f' 
1   4  'w' 
2   7  'u' 
2   7  'b' 
3   5  'h' 
3   5  'f' 
3   5  'm' 
3   5  'd' 
4   7  's' 
4   7  'b' 
4   7  'g' 
IDは、このDFのソースである他のDFのプライマリおよびユニークキーです

。クラスターはキーではなく、異なるIDはしばしば同じクラスター値を持ちます。とにかくそれは私が続けなければならない情報です。私が取得したい何

は、このデータフレームです:

ID Cluster Product_List_by_ID 
1   4  ['b','f','w'] 
2   7  ['u','b'] 
3   5  ['h','f','m','d'] 
4   7  ['s','b','g'] 

これが不可能な場合は、また、このような辞書は罰金のようになります。

d = {ID:[1,2,3,4], Cluster:[4,7,5,7], 
    Product_List_by_ID:[['b','f','w'],['u','b'],['h','f','m','d'],['s','b','g']]} 

私は失敗した多くの方法を試してみました。..それはパンダのデータフレームの値としてリストを挿入することはできないようです。 とにかく私はそれが難しい方法で目標を得ることは困難ではないはずだと思います..私が気が狂っている場合は申し訳ありませんが、コード

何か提案がありますか?必要に応じて、おかげで

答えて

6

使用groupby

df.groupby(['ID', 'Cluster']).Product.apply(list) 

ID Cluster 
1 4    ['b', 'f', 'w'] 
2 7     ['u', 'b'] 
3 5   ['h', 'f', 'm', 'd'] 
4 7    ['s', 'b', 'g'] 
Name: Product, dtype: object 
+0

groupbyの後にすべての操作を実行できます。そのための良いリソースですか? – MYGz

+1

['groupby' docs](http://pandas.pydata.org/pandas-docs/stable/groupby.html) – piRSquared

+1

@MohammadYusufGhazi thx ...コメントは難しいです:-) – piRSquared

2

別の解決策は、最初のstr.stripにより、カラムProductから'を削除されています

df.Product = df.Product.str.strip("'") 

そしてapplygroupbyを、最後のパラメータorient='list'dictionary使用to_dictが必要な場合

print (df.groupby(['ID', 'Cluster']) 
     .Product.apply(lambda x: x.tolist()) 
     .reset_index() 
     .to_dict(orient='list')) 

{'Cluster': [4, 7, 5, 7], 
'ID': [1, 2, 3, 4], 
'Product': [['b', 'f', 'w'], ['u', 'b'], 
      ['h', 'f', 'm', 'd'], ['s', 'b', 'g']]} 
+0

非常に細かい:今また私が疑問に思った第2の方法は説明される!とにかく、dfが17668の異なるIDを持っているのに対し、このdict [鍵]のlenが17645である理由を知ることはできません。 –

+0

はい、私は今それについて考えています。データは慎重ですか?あなたはどのように長さをテストしますか? – jezrael

+0

長さは 'print(len(df.drop_duplicates(['ID'、 'C​​luster'])。index))')でチェックすることができます。 - 最初と2番目の列で重複を削除し、 – jezrael

関連する問題