Python Pandas合并数据框而无需复制列

时间:2019-12-17 17:53:29

标签: python excel pandas join merge

我正在尝试使用pandas合并两个或多个数据框:

DF1:

   Name     E-mail               Phone Number 
   Trent    trent@example.com    12341234
   Barry    barry@example.com    12345678
   Jared    jared@example.com    56781234

DF2:

   Name     E-mail               Age
   Trent    trent@example.com    24
   Barry    barry@example.com    18
   Jared    jared@example.com    31

代码:

df1 = pd.read_excel("Book1.xlsx")
df2 = pd.read_excel("Book2.xlsx")
files = [df1,df2]

df_all = reduce(lambda left,right: pd.merge(left, right, on='Name'), files)
df_all = df_all.drop_duplicates(subset='Name', keep='first')
df_all = df_all.fillna(0)

现在的输出是:

   Name     E-mail_x               Age   E-mail_y             Phone Number
   Trent    trent@example.com      24    trent@example.com    12341234
   Barry    barry@example.com      18    barry@example.com    12345678
   Jared    jared@example.com      31    jared@example.com    56781234

无论如何,都可以删除“ _x”和“ _y”并使它们只是一列

预期输出:

   Name     E-mail                Age      Phone Number
   Trent    trent@example.com      24        12341234
   Barry    barry@example.com      18        12345678
   Jared    jared@example.com      31        56781234

编辑:列名[电子邮件,年龄,电话号码]不是恒定的,可以更改,因此在大多数情况下列名是未知的

2 个答案:

答案 0 :(得分:1)

仅供参考,您不需要reduce函数,只需使用:

df_all = df1.merge(df2)

由于您要合并“名称”,因此正在复制列。如果所有列都相同,则可以删除on ='Name'参数,它将在所有公共列上合并而不是复制它们。

或者,您只能合并来自df2的非重复列:

df_all = df1.merge(df2[['Name','Age']])

答案 1 :(得分:0)

您也可以使用功能join

COMMON_COLUMNS = ["name", "email"]
df3 = df1.join(df2.set_index(COMMON_COLUMNS), on=COMMON_COLUMNS)

df3 = df3.drop_duplicates(subset=COMMON_COLUMNS, keep='first')

您可以在联接之前或之后删除重复项。