2017-05-19 4 views
4

データを引き継ぐ方法を理解しようとしています。この場合、ユーザー情報( 'email_address'、 'name ')を、同じ親会社を共有するすべての下位企業(' companyID ')(' parent_companyID ')に割り当てます。Pandasの階層データ - 同じ "親"値を共有するすべての "子"値のデータをコピーする

In [1]: sample_data = pd.DataFrame(
{'companyID': {0: 112, 1: 223, 2: 434, 3: 777, 4: 790}, 
'email_address': {0: '[email protected]', 1: '', 2: '[email protected]', 3: '[email protected]', 4: ''}, 
'name': {0: 'Joe', 1: '', 2: '', 3: '', 4: 'George'}, 
'parent_companyID': {0: 555, 1: 555, 2: 555, 3: 999, 4: 999}} 
) 

または読みやすくするため:

私のサンプルデータフレームがある

companyID email_address  name parent_companyID 
0 112   [email protected] Joe   555 
1 223           555 
2 434   [email protected]    555 
3 777   [email protected]    999 
4 790        George  999 

私は検索をたくさんやったし、私は解決するのに役立ちます同様の質問を見つけるように見えることはできませんこの問題。私はマルチインデックスを経由してこれを行うに多くのスタブを撮影したが、ある望ましい結果に近いものには至っていない。

companyID email_address  name parent_companyID 
0 112   [email protected] Joe   555 
1 112           555 
2 112   [email protected]    555 
3 223   [email protected] Joe   555 
4 223           555 
5 223   [email protected]    555 
6 434   [email protected] Joe   555 
7 434           555  
8 434   [email protected]    555 
9 777   [email protected]    999 
10 777        George  999 
11 790   [email protected]    999 
12 790        George  999 

それだけだけれども、私は、いくつかの恐ろしいループを介して、この結果を達成避けるために願っています私はこれを解決すると思います。このプロセスは数十万行のデータセットに適用されますが、頻繁に実行されることはないため、効率は考慮されますが、厳しい要件ではありません。それについては、私はループのルートを行くだろうが、私は良い方法でなければならないと思う。たとえそれが正しい方向に向いていても、どんな助けでも大歓迎です!私はこの日に私の髪を引っ張ってきた...

答えて

1

自己マージ! 1の自己との

  • pd.mergeと便利マージ
  • の左半分のための接尾辞を置く内側
  • を見て、私はマージの右半分から'companyID'以外のすべてをしたいので、私はそれがヌル文字列としてサフィックスの左
  • 私は左半分から'companyID'がほしいと思う...注意:私は接尾辞' 'を単一のスペースにしました。私はこれを行って、私の名前を変更すると後でシンプルなものを使用するようにしました。str.strip
  • 私が望む順序を得るために最終結果をスライスする列を再配置します。それをしない

on = 'parent_companyID' 
mrg = sample_data.merge(sample_data, on=on, suffixes=[' ', '']) 
cols = sample_data.columns.tolist() 
cols.remove('companyID') 
cols.insert(0, 'companyID ') 
mrg[cols].rename(columns=str.strip) 

    companyID  email_address  name parent_companyID 
0   112 [email protected] 112Name    555 
1   112           555 
2   112 [email protected]      555 
3   223 [email protected] 112Name    555 
4   223           555 
5   223 [email protected]      555 
6   434 [email protected] 112Name    555 
7   434           555 
8   434 [email protected]      555 
9   777 [email protected]      999 
10  777      790Name    999 
11  790 [email protected]      999 
12  790      790Name    999 
+0

!どうもありがとうございます!!!!! – BrandonTerrebonne

関連する問題