Python在不复制列的情况下合并数据帧

Python在不复制列的情况下合并数据帧,python,excel,pandas,join,merge,Python,Excel,Pandas,Join,Merge,我正在尝试使用pandas合并两个或多个数据帧: DF1: DF2: 代码: 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', k

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

DF1:

DF2:

代码:

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

编辑:列名[电子邮件、年龄、电话号码]不是固定不变的,它们可能会更改,因此列名在大多数情况下是未知的

仅供参考,您不需要reduce功能,只需使用:

df_all = df1.merge(df2)
它正在复制列,因为您正在“名称”上合并。如果所有列都相同,可以删除on='Name'参数,它将合并所有公共列,而不是复制它们

或者,您可以仅合并df2中的非重复列:

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

您也可以使用函数
join

COMMON_COLUMNS=[“name”,“email”]
df3=df1.join(df2.set\u索引(公共列),on=COMMON\u列)
df3=df3.drop_重复项(子集=公共_列,keep='first')

您可以在加入之前或之后删除重复项。

merge(左、右、开=['Name','E-mail']列名不总是已知的,它们可以从不同的DATAFAMESE改变,如果是这样的话,那么您需要更好地解释您想用什么逻辑来处理这样的重复。您可以考虑将所有重复列作为键<代码> DF1.合并(DF2)的合并。
或者您可以只信任一个数据帧中的列(比如左边的一个),然后只使用名称进行合并,从右边的帧中删除所有其他重叠的列。但是这两个数据帧的结果可能会有很大的不同。纯
pd.merge(df1,df2)有什么问题吗?
df_all = df1.merge(df2)
df_all = df1.merge(df2[['Name','Age']])