合并Index上的Panda DataFrame,添加其他列,并且没有重复的索引

时间:2019-07-01 21:47:23

标签: python pandas

df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
 'B': ['B0', 'B1', 'B2', 'B3'],
 'C': ['C0', 'C1', 'C2', 'C3'],
 'D': ['D0', 'D1', 'D2', 'D3']},
index=[0, 1, 2, 3])

df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
 'B': ['B4', 'B5', 'B6', 'B7'],
 'C': ['C4', 'C5', 'C6', 'C7'],
 'D': ['D4', 'D5', 'D6', 'D7']},
index=[4, 5, 6, 7])

df22 = pd.DataFrame({'A2': ['A4', 'A5', 'A6', 'A7'],
 'B2': ['B4', 'B5', 'B6', 'B7'],
 'C2': ['C4', 'C5', 'C6', 'C7'],
 'D2': ['D4', 'D5', 'D6', 'D7']},
index=[4, 5, 6, 7])

frames = [df1, df2, df22]
result = pd.concat(frames,sort=False)
result

enter image description here

我们看到,重复索引4,5,6,7,并添加了NAN。 如何有意义地合并..?

  

A2,B2,C2,D2处的NaN指数为0、1、2、3可接受

     
    

但是索引4,5,6,7不应重复且不应包含NaN

  

3 个答案:

答案 0 :(得分:6)

您想要这样的东西吗?您可以使用数据帧索引在pd.concat的前两个数据帧中垂直join,将 pd.concat([df1,df2]).join(df22) 到df22。

    A   B   C   D   A2   B2   C2   D2
0  A0  B0  C0  D0  NaN  NaN  NaN  NaN
1  A1  B1  C1  D1  NaN  NaN  NaN  NaN
2  A2  B2  C2  D2  NaN  NaN  NaN  NaN
3  A3  B3  C3  D3  NaN  NaN  NaN  NaN
4  A4  B4  C4  D4   A4   B4   C4   D4
5  A5  B5  C5  D5   A5   B5   C5   D5
6  A6  B6  C6  D6   A6   B6   C6   D6
7  A7  B7  C7  D7   A7   B7   C7   D7

输出:

combine_first

另一种方法是使用from functools import reduce reduce(lambda x,y: x.combine_first(y), [df1,df2,df22])

df1.combine_first(df2).combine_first(df22)

    A   A2   B   B2   C   C2   D   D2
0  A0  NaN  B0  NaN  C0  NaN  D0  NaN
1  A1  NaN  B1  NaN  C1  NaN  D1  NaN
2  A2  NaN  B2  NaN  C2  NaN  D2  NaN
3  A3  NaN  B3  NaN  C3  NaN  D3  NaN
4  A4   A4  B4   B4  C4   C4  D4   D4
5  A5   A5  B5   B5  C5   C5  D5   D5
6  A6   A6  B6   B6  C6   C6  D6   D6
7  A7   A7  B7   B7  C7   C7  D7   D7

输出:

.*?\\bTABLE\\s+\\w+\\.(\\w+)\\b.*

答案 1 :(得分:2)

您可以先串联df1df2,然后将df22axis=1串联,例如:

>>> pd.concat([pd.concat([df1, df2]), df22], axis=1)
    A   B   C   D   A2   B2   C2   D2
0  A0  B0  C0  D0  NaN  NaN  NaN  NaN
1  A1  B1  C1  D1  NaN  NaN  NaN  NaN
2  A2  B2  C2  D2  NaN  NaN  NaN  NaN
3  A3  B3  C3  D3  NaN  NaN  NaN  NaN
4  A4  B4  C4  D4   A4   B4   C4   D4
5  A5  B5  C5  D5   A5   B5   C5   D5
6  A6  B6  C6  D6   A6   B6   C6   D6
7  A7  B7  C7  D7   A7   B7   C7   D7

答案 2 :(得分:0)

有几种选择。对于这种确切的情况,我建议使用merge后跟join。我喜欢这种方法,因为它更像是数据库函数。

df1.merge(df2,how='outer').join(df22,how='outer')

A   B   C   D   A2  B2  C2  D2
0   A0  B0  C0  D0  NaN NaN NaN NaN
1   A1  B1  C1  D1  NaN NaN NaN NaN
2   A2  B2  C2  D2  NaN NaN NaN NaN
3   A3  B3  C3  D3  NaN NaN NaN NaN
4   A4  B4  C4  D4  A4  B4  C4  D4
5   A5  B5  C5  D5  A5  B5  C5  D5
6   A6  B6  C6  D6  A6  B6  C6  D6
7   A7  B7  C7  D7  A7  B7  C7  D7