2016-05-06 4 views
1
interactions_df = interactions[interactions['interaction_type'].isin([1,2,3])] 

私はinteraction_dfデータフレームを持っています。これは、印刷時に表示されるように:私はこの結果を得たデータフレームへのPandas GroupByオブジェクト、コンマ区切りファイルにデータを格納

grouped = interactions_df.groupby(['item_id', 'user_id']).count() 
print(grouped) 

item_id user_id interaction_type created_at 
405777 2690450  1 1 
     2081252  1 1  
805572 2081252  1 1 
1180447 2690450  1 1 
1266442 732722   1 1 
1803133 2690450  1 1 
2651366 687093   1 1 
2668706 1974005  1 1 

を今すぐ

user_id item_id interaction_type created_at 
1974005 2668706 1 1444154047 
2690450 405777 1 1445338496 
2690450 1180447 1 1444806365 
2690450 1803133 1 1440480562 
2081252 405777 1 1442346826 
2081252 805572 1 1441286115 
732722 1266442 1 1446745768 
687093 2651366 1 1445373507 

'ITEM_ID' と 'user_idの' などにこのデータをグループ化する簡単なことで私は必要なのcsvファイルで私のデータを格納することですが、この形式で

item_id user_id 
405777 2690450, 2081252    
805572 2081252   
1180447 2690450   
1266442 732722   
1803133 2690450   
2651366 687093   
2668706 1974005   

単一の項目に対して複数のユーザーが存在する場合、私はカンマ区切りリストとちょうどこれらの2列は、他の情報またはカウントでそれを必要とします。

どうすればこの問題を解決できますか?提案してください。

ありがとうございました。

答えて

1

は、私はあなたが最初reset_indexマルチインデックスを削除することができると思います。その後groupby再び及びapplyjoin(列user_idが数値であるならば、あなたはastypeによってstringintをキャスト必要)と最後の書き込みto_csv

grouped = interactions_df.groupby(['item_id', 'user_id'], as_index=False).count() 
print(grouped) 
    item_id user_id interaction_type created_at 
0 405777 2081252     1   1 
1 405777 2690450     1   1 
2 805572 2081252     1   1 
3 1180447 2690450     1   1 
4 1266442 732722     1   1 
5 1803133 2690450     1   1 
6 2651366 687093     1   1 
7 2668706 1974005     1   1 

df = grouped.groupby('item_id')['user_id'].apply(lambda x: ", ".join(x.astype(str))) 
              .reset_index() 
print df 

    item_id   user_id 
0 405777 2081252, 2690450 
1 805572   2081252 
2 1180447   2690450 
3 1266442   732722 
4 1803133   2690450 
5 2651366   687093 
6 2668706   1974005 

df.to_csv('file', index=False) 

get_level_valuesと別の少しクレイジー解決策:

grouped = interactions_df.groupby(['item_id', 'user_id']).count() 

print grouped.index.get_level_values('user_id').to_series() 
      .groupby(grouped.index.get_level_values('item_id')) 
      .apply(lambda x: ", ".join(x.astype(str))) 
      .reset_index(name='user_id') 

    item_id   user_id 
0 405777 2081252, 2690450 
1 805572   2081252 
2 1180447   2690450 
3 1266442   732722 
4 1803133   2690450 
5 2651366   687093 
6 2668706   1974005 
+0

おかげで、あなたの提案は自分のデータに対して完璧に機能しました。しかし、あなたは私に少し説明することができますか、それはどのように動作するのですか? – ssh26

+0

reset_index()はどのように機能しましたか?そして作品をリセットする方法grouped.groupby( 'ITEM_ID')[ 'user_idの']一部 – ssh26

+1

は、より良い(http://pandas.pydata.org/pandas-docs/stable/indexing.html#reset- [ここ]ドキュメントで説明していますインデックス)。また、 'apply'は、ある関数でデータを集約しています。明らかに 'sum'または' mean'ですが、いくつかの関数をパラメータで使うことができます。次に、匿名関数 'lambda'を使用します。私は最高のは、 'groupby'は[こちら](http://wesmckinney.com/blog/groupby-fu-improvements-in-grouping-and-aggregating-data-in-pandas/)で説明したと思います。 – jezrael

関連する問題