通过ID合并两个Excel文件并合并同名列(Python, Pandas)

2 投票
1 回答
8832 浏览
提问于 2025-04-18 08:19

我刚开始接触stackoverflow和Python中的pandas库。在一篇帖子中,我找到了部分答案,链接是如何用Python 2.7将两个Excel文件按ID合并成一个Excel文件

不过,我还想把两个Excel文件中同名的列合并在一起。我以为下面这篇帖子会有我想要的答案,但我猜它的标题不太准确:合并具有相同列名的Pandas数据框

现在我有以下代码:

import pandas as pd

file1 = pd.read_excel("file1.xlsx")
file2 = pd.read_excel("file2.xlsx")

file3 = file1.merge(file2, on="ID", how="outer")

file3.to_excel("merged.xlsx")

file1.xlsx

ID,JanSales,FebSales,test
1,100,200,cars
2,200,500,
3,300,400,boats

file2.xlsx

ID,CreditScore,EMMAScore,test
2,good,Watson,planes
3,okay,Thompson,
4,not-so-good,NA,

我得到的结果是merged.xlsx

ID,JanSales,FebSales,test_x,CreditScore,EMMAScore,test_y
1,100,200,cars,NaN,NaN,
2,200,500,,good,Watson,planes
3,300,400,boats,okay,Thompson,
4,NaN,NaN,,not-so-good,NaN,

我想要的结果是merged.xlsx

ID,JanSales,FebSales,CreditScore,EMMAScore,test
1,100,200,NaN,NaN,cars
2,200,500,good,Watson,planes
3,300,400,okay,Thompson,boats
4,NaN,NaN,not-so-good,NaN,NaN

在我的实际数据中,有200多列对应于我示例中的“test”列。我希望程序能找到file1.xlsx和file2.xlsx中同名的列,并将它们合并到最终的文件中。

1 个回答

3

好的,这里有一种更灵活的方法。在合并数据时,我们假设会出现重复的列名,结果可能会变成 'column_name_x' 或 '_y'。

首先,我们要找出所有重复的列名,并把 'ID' 从这个列表中去掉。

In [51]:

common_columns = list(set(list(df1.columns)) & set(list(df2.columns)))
common_columns.remove('ID')
common_columns
Out[51]:
['test']

接下来,我们可以遍历这个列表,创建新的列,并使用 where 来根据哪个值不为空来有条件地赋值。

In [59]:

for col in common_columns:
    df3[col] = df3[col+'_x'].where(df3[col+'_x'].notnull(), df3[col+'_y'])
df3
Out[59]:
   ID  JanSales  FebSales test_x  CreditScore EMMAScore  test_y    test
0   1       100       200   cars          NaN       NaN     NaN    cars
1   2       200       500    NaN         good    Watson  planes  planes
2   3       300       400  boats         okay  Thompson     NaN   boats
3   4       NaN       NaN    NaN  not-so-good       NaN     NaN     NaN

[4 rows x 8 columns]

最后,只需要删除所有多余的列就可以了:

In [68]:

clash_names = [elt+suffix for elt in common_columns for suffix in ('_x','_y') ]
clash_names
df3.drop(labels=clash_names, axis=1,inplace=True)
df3
Out[68]:
   ID  JanSales  FebSales  CreditScore EMMAScore    test
0   1       100       200          NaN       NaN    cars
1   2       200       500         good    Watson  planes
2   3       300       400         okay  Thompson   boats
3   4       NaN       NaN  not-so-good       NaN     NaN

[4 rows x 6 columns]

上面的代码片段来自这个链接:使用列表推导为列表元素添加前缀

撰写回答