2017-04-18 22 views
1

私は次の3つのデータフレームを持っています。これらのデータフレームは、グループitem1,item2item3など、およびこのグループ内の数値の位置148, 179, 188, 267, ...です。パンダのデータフレーム:3つのデータフレームを2つの列でマージし、ほとんどの列を無視しますか?

import pandas as pd 

data1 = {"grouping": ["item1", "item1", "item1", "item2", "item2", "item2", "item2", ...], 
     "positions": [148, 179, 188, 267, 693, 963, 979, ...], 
     "metadata": [5, 1, 8, 3, 731, 189, 9, ...], 
     "unique_column1" : ['QLZX9J', 'L3FPRU', '69TVKF', 'N096NQ', 'JM89V5', 'W7JBOL', '63KKZZ', ...] } 




data2 = {"grouping": ["item1", "item1", "item1", "item1", "item1", "item1", "item2", ...], 
     "positions": [118, 241, 431, 448, 455, 677, 740, ...], 
     "metadata": [5, 1, 8, 3, 731, 189, 9, ...], 
     "unique_column2" : [4714, 1178, 235, 47, 54, 89, 12, ...] } 

data3 = {"grouping": ["item1", "item1", "item1", "item1", "item1", "item1", "item1", ...], 
     "positions": [118, 148, 179, 188, 241, 431, 448,...], 
     "metadata": [5, 1, 8, 3, 731, 189, 9, ...], 
     "unique_column3" : ['a', 'a', 'a', 'a', 'a', 'a', 'a', ...] } 


df1 = pd.DataFrame(data1) 
df2 = pd.DataFrame(data2) 
df3 = pd.DataFrame(data3) 

df1 
>>> grouping positions metadata unique_column1 
0  item1  148   5   QLZX9J 
1  item1  179   1   L3FPRU 
2  item1  188   8   69TVKF 
3  item2  267   3   N096NQ 
4  item2  693  731   JM89V5 
5  item2  963  189   W7JBOL 
6  item2  979   9   63KKZZ 
7  ....  ...  ...   ... 

df2 
>>> grouping positions metadata unique_column2 
0  item1  118   5   4714 
1  item1  241   1   1178 
2  item1  431   8   235 
3  item1  448   3    47 
4  item1  455  731    54 
5  item1  677  189    89 
6  item2  740   9    12 

df3 
>>> grouping positions metadata unique_column3 
0  item1  118   5    a 
1  item1  148   1    a 
2  item1  179   8    a 
3  item1  188   3    a 
4  item1  241  731    a 
5  item1  431  189    a 
6  item1  448   9    a 
Iは df2に= item1 groupingpositions = 118持つ行が df3で同じ行とマージされるように、 groupingpositions両方でこれら三つのデータフレームをマージしたい

。これらのデータフレームの間には、同じで、コピーしないでください。実際には、df1で最終マージされたデータフレームにマージする唯一の一意の列はunique_column1あるとdf2unique_column2ある、など

どのようにして唯一の指標として2つの列を使用して、一緒に3つのデータフレームから1列をマージしていますか?

merged 
grouping positions metadata unique_column1 unique_column2 unique_column3 
item1  118   5   0     4714    'a' 
item1  148   1   'QLZX9J'   0     'a' 
item1  179   8   'L3FPRU'   0     'a' 
item1  188   3   '69TVKF'   0     'a' 
item1  241   731   0     1178    'a' 
......... 
+0

すべての 'unique_column *'列は、同じテキストで始まるか、あるいは共通の列のリストを持っていますか? – MaxU

+0

@MaxUはい、私はユニークな列のリストを知っています。最後にマージする必要があるのは1つだけです。残りは無視してください。 – ShanZhengYang

答えて

1
dfs = [df1, df2, df3] 

jcols = ['grouping', 'positions'] 
ucols = ['unique_column1','unique_column2','unique_column3'] 

pd.concat([df.set_index(jcols)[df.columns.intersection(ucols)] 
      for df in dfs], 
      axis=1) \ 
    .reset_index() \ 
    .fillna(0) 

結果:

grouping positions unique_column1 unique_column2 unique_column3 
0  item1  118    0   4714.0    a 
1  item1  148   QLZX9J    0.0    a 
2  item1  179   L3FPRU    0.0    a 
3  item1  188   69TVKF    0.0    a 
4  item1  241    0   1178.0    a 
5  item1  431    0   235.0    a 
6  item1  448    0   47.0    a 
7  item1  455    0   54.0    0 
8  item1  677    0   89.0    0 
9  item2  267   N096NQ    0.0    0 
10 item2  693   JM89V5    0.0    0 
11 item2  740    0   12.0    0 
12 item2  963   W7JBOL    0.0    0 
13 item2  979   63KKZZ    0.0    0 
これは、TEMが存在しない場合は、それがマージされたテーブルには、次のようになります0でなければなりませんもう少し複雑 pandas.merge()

よりも思えます

+0

これは、 'df1'と' df2'の "繰り返された"列が 'pd.merge()'の後に存在する可能性がありますか? – ShanZhengYang

+0

@ShanZhengYangでは、 '['grouping'、 'positions']'列は結合のために使用され、すべてが 'ucols'の一意の列に指定されます。他のすべての列は無視されます(削除されました) – MaxU

+0

私は今理解しています。ああ、私はこれがどのように機能するか見る。ありがとうございました。 – ShanZhengYang

関連する問題