2017-07-10 18 views
0

私は2つのフィールドの電話番号と電子メールを持っています。同じ人物の行をグループ化する必要があります。つまり、電話番号または電子メールが同じである必要があります。Pandas、Pythonのカスタムgroupbyクエリで、制約が複数の行に依存する

これにgroupbyを使用できますか?私はすでに、辞書を使用してループするアルゴリズムを行っているなど

例:

index phone email 
0  123 [email protected] 
1  123 [email protected] 
2  456 [email protected] 
3  333 [email protected] 
4  443 [email protected] 

私はグループ一緒にインデックス0,1,3と一緒に残り

+2

示す例と一緒にいくつかのサンプルデータを入力してください期待される出力。 –

+0

あなたの意図を理解し、助けてくれるサンプルと対応する出力を提供してください –

+0

いいえ、Pandas groupbyは適切なツールではありません。データをグラフで表現し、[connected components](https://en.wikipedia.org/wiki/Connected_component_(graph_theory))を見つける必要があります。 – unutbu

答えて

2

負荷にデータをにパンダを必要としますグラフ。例えば、networkx

G = nx.from_pandas_dataframe(df, 'email', 'phone', 'index') 

を使用して各email及びデータフレームに記載されているphone、エッジの属性として関連付けられたインデックスとの間のエッジを持つグラフを作成します。

そして個人がグラフのconnected componentsとして同定することができる。

components = nx.connected_component_subgraphs(G) 

次に、各成分のエッジに関連するインデックス値を見つけることができます。 インデックスは、次にように、あなたに一人の個人に関連付けられているすべての行を示し、元のデータフレームをスライスするために使用することができます。

import pandas as pd 
import networkx as nx 
df = pd.DataFrame({'email': ['[email protected]', '[email protected]', '[email protected]', '[email protected]', '[email protected]'], 
        'phone': [123, 123, 456, 333, 443], 'index': [0, 1, 2, 3, 4]}) 

G = nx.from_pandas_dataframe(df, 'email', 'phone', 'index') 

components = nx.connected_component_subgraphs(G) 
for cc in components: 
    idx = [dct['index'] for node1, node2, dct in cc.edges(data=True)] 
    group = df.iloc[idx] 
    print(group) 
    print('-'*80) 

利回り

 email index phone 
2 [email protected]  2 456 
4 [email protected]  4 443 
-------------------------------------------------------------------------------- 
    email index phone 
0 [email protected]  0 123 
1 [email protected]  1 123 
3 [email protected]  3 333 
+0

ありがとうございます。それは私にコンポーネントを使用するように私を攻撃しなかった。また、dfをnumpyの行列に変換し、df行をループするのではなく、行をループすることができることに気付きました。 –

関連する問題