2017-04-18 66 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

相关问题