2017-01-23 16 views
0

私は次のようなデータフレームで作業しています。各連続部分を他の部分と分けたいと思います。つまり、すべてのゼロの 'diff'は最後の非ゼロ項目同じ名前の結果は次のようになります:group1:('E', (1,2,3));グループ2:('E',(4,5));グループ3:('C',(1,2))データフレーム:不連続な列を持つグループ

どうすればいいですか?どうもありがとう!

+----+----+------------+ 
|name|diff|num_in_group| 
+----+----+------------+ 
| E|null|   1| 
| E| 0|   2| 
| E| 0|   3| 
| E| 40|   4| 
| E| 0|   5| 
| C|null|   1| 
| C| 0|   2| 
+----+----+------------+ 
+0

ようこそ!最初に[ツアー](http://stackoverflow.com/tour)にアクセスし、[よくある質問をする方法](http://stackoverflow.com/help/how-to-ask)を学んで[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例を参照してください。私たちがあなたを助けてくれるのは簡単です。 – MrLeeh

答えて

0
dic_group = {} 

new_group = True 

counter = 0 

for index in df.index: 

    if new_group == False: 

     if df.loc[index, 'diff'] == 0: 

      dic_group[ref_name]['numbers_in_group'].append(df.loc[index, 'num_in_group']) 

     else: 

      new_group = True 

    if new_group: 

     counter = counter + 1 

     ref_name = 'group%d' %counter 

     dic_group[ref_name]={} 

     dic_group[ref_name]['name'] = df.loc[index, 'name'] 

     dic_group[ref_name]['numbers_in_group'] = [] 

     dic_group[ref_name]['numbers_in_group'].append(df.loc[index, 'num_in_group']) 

     new_group = False 

OUTPUT:スタックオーバーフローへ

{'group1': {'name': 'E', 'numbers_in_group': [1, 2, 3]}, 
'group2': {'name': 'E', 'numbers_in_group': [4, 5]}, 
'group3': {'name': 'C', 'numbers_in_group': [1, 2]}} 
+0

まずはお返事いただきありがとうございます!私が記述したことは一例に過ぎず、テーブルは非常に大きく(18億行以上)なります。スパークの効率的な方法はありますか? –

+0

そうは思わない。通常はgroupbyは簡単で高速な/フレンドリーなソリューションです。あなたはグループを定期的に壊しています。tqdmライブラリを使用して、そのループがどれくらい長く続くかを見積もることができます: "tqdm import tqdmから、tqdm(df.index)のインデックスに使用する: "ps:upvote me bro:p – epattaro

+0

ええ、groupbyは良い方法でしょう。これらの行は異なるファイルから来るはずですが、ファイル名は変換時に失われますので、このホットポテトを処理する必要があります。とにかく、あなたの答えをありがとう! –

関連する問題