通过ID合并两个Excel文件并合并具有相同名称的列(python,pandas)

我是新来的python stackoverflow和pandas。 我在post中find了我的答案的一部分寻找合并两个Excel文件的ID到一个Excel文件使用Python 2.7

但是,我也想合并或组合来自两个excel文件同名的列。 我认为下面的post会有我的答案,但我想这不是正确的标题: 合并与相同的列名称的大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,testing
1100200,汽车
2200500,
3300400,船

file2.xlsx

ID,CreditScore等,EMMAScore,testing
2,良好的,沃森,飞机
3,还好,汤普森,
4,不那么好,NA,

我得到的是merged.xlsx

ID,JanSales,FebSales, test_x ,CreditScore,EMMAScore, test_y
1100200,汽车不同,NaN,NaN的,
2200500,好,沃森,飞机
3300400,船,还好,汤普森,
4,为NaN,NaN的,,不那么好,NaN的,

我想要的是merged.xlsx

ID,JanSales,FebSales,CreditScore,EMMAScore, testing
1100200大,NaN,NaN的,汽车
2200500,好,沃森,飞机
3300400,还好,汤普森,船
4,为NaN,NaN的,不那么好,NaN的,萘乙酸

在我的实际数据中,有200多列对应于我的示例中的“testing”列。 我希望程序在file1.xlsx和file2.xlsx中find具有相同名称的这些列,并将它们合并到合并文件中。

好的,这里是一个更加dynamic的方式,合并之后我们假设冲突将会发生并导致'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'] 

现在我们可以遍历这个列表来创build新列,并使用where有条件地分配值取决于哪个值不为null。

 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] 

上面的代码片段是这样的: 用列表理解列出元素的前缀