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

Posted

技术标签:

【中文标题】按 ID 合并两个 Excel 文件并合并具有相同名称的列(python、pandas)【英文标题】:Merging two Excel files by ID and combining columns with same name (python, pandas) 【发布时间】:2014-07-22 23:22:24 【问题描述】:

我是 Python 的 *** 和 pandas 的新手。我在帖子 Looking to merge two Excel files by ID into one Excel file using Python 2.7

中找到了部分答案

但是,我还想合并或合并两个同名 excel 文件中的列。我以为下面的帖子会有我的答案,但我猜它的标题不正确:Merging Pandas DataFrames with the same column name

现在我有代码:

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,汽车 2,200,500, 3,300,400,船

file2.xlsx

ID、信用分数、EMMAScore、测试 2,好,沃森,飞机 3,好的,汤普森, 4,不太好,NA,

我得到的是merged.xlsx

ID、JanSales、FebSales、test_x、CreditScore、EMMAScore、test_y 1,100,200,汽车,NaN,NaN, 2,200,500,,好,沃森,飞机 3,300,400,船,好的,汤普森, 4,NaN,NaN,,不太好,NaN,

我想要的是merged.xlsx

ID、JanSales、FebSales、CreditScore、EMMAScore、测试 1,100,200,NaN,NaN,汽车 2,200,500,好,沃森,飞机 3,300,400,好的,汤普森,船 4,NaN,NaN,不太好,NaN,NaA

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

【问题讨论】:

两个 excel 文件中“test”列的值是否相同?两个excel文件的行数和IDS是否相同?如果是前者,那么您可以只删除其中一列并重命名剩余的列,如果是后者,那么您可以在不传递 how='outer' 的情况下执行合并,因为这将默认为内部,并将合并在两者中都存在的 id 上跨度> @EdChum:“测试”列的值可以是任何值。我只是使用偶数和奇数来简化示例。两个 excel 文件中的行数/ID 数不会相同,实际上它们几乎不会具有相同的 ID。我更新了示例以更准确地反映我的真实数据。 合并时它只会在值不匹配时重命名列,这将在您的情况下创建大量 NaN 值,实际值是多少,因为可能有其他方法可以解决这个问题?一种天真的方法是在合并后进行一些后处理,您知道一个文件和另一个文件中的 id 和列,因此您可以使用它通过选择值来创建最终值 @EdChum:值可以是任何值,请参阅更新后的帖子。有很多 NaN 值是可以的,实际上这就是我所期望的。我基本上希望代码在两个文件中查找具有相同名称的列,并将它们组合成第三个文件中的一列。正如我在上一段中提到的,真实数据将有 200+ 列,这些列在两个文件中可能具有相同的名称,这使得选择列/值变得乏味。 我已经更新了我的答案,这应该适合你的情况 【参考方案1】:

好的,这是一种更动态的方式,合并后我们假设会发生冲突并导致'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]:

***_names = [elt+suffix for elt in common_columns for suffix in ('_x','_y') ]
***_names
df3.drop(labels=***_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]

上面的sn-p来自这个:Prepend prefix to list elements with list comprehension

【讨论】:

感谢您的回答。如果我正在处理简单数据,例如在我的示例中,这将起作用,但正如我在上一段中所说,有 200+ 列具有相同的名称(即 test1、test2、... test200 ) 在 df1 和 df2 中,我想合并到一个文件中。我事先不知道这些列的名称(“测试”列的真实名称未知),以便能够有条件地选择列值并删除额外的列。 感谢您发布您的答案。我希望 pandas 提供了一种可以完成的方法,但是您的回答肯定可以解决我的问题。 @ferrios25 可能有更好的方法,但我现在想不出,很高兴我能提供帮助

以上是关于按 ID 合并两个 Excel 文件并合并具有相同名称的列(python、pandas)的主要内容,如果未能解决你的问题,请参考以下文章

Excel中如何合并相同的ID,不同的数据合并一起

excel 两个表格如何匹配多个数据并合并

使用 XSLT 将具有相同 ID 的元素 (XML) 合并到 txt 文件

如何合并列中具有相同值的两个表

两个数据框,计算重复的ID并与另一个具有相同ID的数据框合并?

如何在 Alteryx 中合并两个文件