2017-04-18 65 views
1

我有以下三個數據幀,這兩個數據幀是由兩列「索引」:有一個分組item1,item2,item3等和這個組內的數字位置148, 179, 188, 267, ...熊貓數據框:將三個數據框合併爲兩列,而忽略大多數列?

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 

我想雙方groupingpositions這三個dataframes合併,使之與grouping = item1positions = 118df2排在df3與同一行合併。這些數據框之間有許多列是相同的,不應複製。事實上,在df1最終合併數據框合併的唯一獨特的列是unique_column1df2unique_column2

一個人如何從三個dataframes合併一列在一起,只用兩列索引?這似乎有點比pandas.merge()

更復雜如果TEM不存在,它應該是0。合併表應該是這樣的:

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是的,我知道唯一列的列表。最後只有一個應該合併 - 其餘的應該被忽略。 – 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 
+0

這是否會刪除'df1'和'df2'中所有可能存在'pd.merge()'後面的「重複」列? – ShanZhengYang

+0

@ShanZhengYang,它將使用'['分組','位置']'列加入,並在'ucols'唯一列中指定所有列。所有其他列將被忽略(丟棄) – MaxU

+0

我現在明白了。啊,我明白這是如何工作的。謝謝。 – ShanZhengYang

相關問題