熊猫合并数据帧

时间:2017-06-29 11:59:16

标签: python pandas dataframe

我想要合并几个数据帧,但问题是没有相同的列,我想只合并特定的行。我将展示一个例子,以便更容易:

MAIN_DF ,我希望所有人都合并到它:

key    A    B    C
0001   1    0    0
0002   1    1    1
0003   0    0    1

DF_1

key    A    B    C   D
0001   1    0    0   1
0003   0    0    1   0
0004   1    1    1   1

DF_2

key    C    D    E   F
0004   1    1    0   1
0005   0    0    1   0
0006   1    1    1   1

所以我想将它全部合并到 MAIN_DF ,所以MAIN_DF将是:

key    A    B    C    D    E   F
0001   1    0    0    1    0   0
0002   1    1    1    0    0   0
0003   0    0    1    0    0   0
0004   0    0    0    1    0   1
0005   0    0    0    0    1   0
0006   0    0    0    1    1   1

查看列已更新并添加了新行。

是否可以使用pandas进行,而不需要执行long和slow循环以及if语句?

谢谢

3 个答案:

答案 0 :(得分:3)

我认为你需要DataFrame.combine_first

MAIN_DF = MAIN_DF.set_index('key')
DF_1 = DF_1.set_index('key')
DF_2 = DF_2.set_index('key')

df = MAIN_DF.combine_first(DF_1).combine_first(DF_2).fillna(0).astype(int).reset_index()
print (df)
    key  A  B  C  D  E  F
0  0001  1  0  0  1  0  0
1  0002  1  1  1  0  0  0
2  0003  0  0  1  0  0  0
3  0004  1  1  1  1  0  1
4  0005  0  0  0  0  1  0
5  0006  0  0  1  1  1  1

答案 1 :(得分:1)

以下是groupby的方法。

import pandas as pd 
import numpy as np

df1 = pd.DataFrame([[1, 0, 0],
                    [1, 1, 1],
                    [0, 0, 1]],    columns=['a', 'b', 'c'],      index=[1, 2, 3])
df2 = pd.DataFrame([[1, 0, 0, 1],
                    [0, 0, 1, 0],
                    [1, 1, 1, 1]], columns=['a', 'b', 'c', 'd'], index=[1, 3, 4])
df3 = pd.DataFrame([[1, 1, 0, 1],
                    [0, 0, 1, 0],
                    [1, 1, 1, 1]], columns=['c', 'd', 'e', 'f'], index=[4, 5, 6])

# combine the first and second df
df4 = pd.concat([df1, df2])
grouped = df4.groupby(level=0)
df5 = grouped.first()

# combine (first and second combined), with the third
df6 = pd.concat([df5, df3])
grouped = df6.groupby(level=0)
df7 = grouped.first()

# fill na values with 0
df7.fillna('0', inplace=True)

print(df)

    a   b   c   d   e   f
1   1   0   0   1   0   0
2   1   1   1   0   0   0
3   0   0   1   0   0   0
4   1   1   1   1   0   1
5   0   0   0   0   1   0
6   0   0   1   1   1   1

答案 2 :(得分:0)

您可以使用concat水平连接所需的数据帧:

import pandas as pd
df = pd.concat([df1,df2], axis=1, verify_integrity=True)

“verify_integrity”参数检查重复项。

点击此处了解有关merge, join and concatenate

的更多信息