我收到一个CSV文件列表(从3个到20个不等),我需要在主键A上进行内部合并,并获取所有剩余的列,并将它们放在一个合并的单个数据帧中.

由于我不能共享整个CSV文件,所以我举了一些例子:

from functools import reduce

df1 = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
df2 = pd.DataFrame({'A': [2, 3, 4], 'C': [10, 11, 12], 'B': [4, 5, 6]})
df3 = pd.DataFrame({'A': [3], 'B': [0], 'D': [13]})
df4 = pd.DataFrame({'A': [3, 7], 'B': [9, 1], 'D': [1, 2]})

list_1 = [df1, df2, df3, df4]
list_2 = [df1, df2, df3]

merged_df = reduce(lambda left, right: pd.merge(left, right, on='A'), list_1)

如您所见,结果数据帧应该只有一行,因为3是所有数据帧之间共享的唯一主键.但是,当我使用上面的代码时,3个数据帧没有错误,但4个数据帧有错误:

MergeError: Passing 'suffixes' which cause duplicate columns {'B_x'} is not allowed.

以下是我的预期输出(1 ROW / 8 COLUMNS):

我添加了合并标题和管道只是为了澄清

       # |  MERGE 1   |   MERGE 2   |  MERGE 3
A  B_1   |   C  B_2   |  B_3   D_1  |  B_4  D_2
3    6   |  11    5   |    0    13  |    9    1

复制的列B and D应该具有像计数器一样的递增后缀.

你们有什么办法解决这个问题吗?我觉得我们需要使用enumerate Inside reduce,但我真的不知道如何结合这一点.网站推荐了这merge multiple dataframe with specified suffix个,但我不认为它适合我的用法.

推荐答案

问题是,中间合并可以在与前一个合并阶段不同的列名之间找到匹配.
我们可以正式地 for each left重叠的列名添加一个变量后缀(通过使用itertools.count),并让right列保持不变,以便进行后续的合并.
然后,收集多次重叠的列名(没有后缀)的计数.
然后将这些计数用于最终合并数据帧的列上的连续后缀增量:

from functools import reduce
from itertools import count

...
lst = [df1, df2, df3, df4]

sfx_cnt = count(1)
merged_df = reduce(lambda left, right:
                   pd.merge(left, right, on='A',
                            suffixes=(f'_{next(sfx_cnt)}', '')), lst)

col_counts = merged_df.columns.str[0].value_counts()
col_counts = {k: iter(range(1, v + 1))
              for k, v in col_counts[col_counts > 1].items()}

merged_df.columns = [f'{c}_{next(col_counts[c])}'
                     if c in col_counts else c
                     for c in merged_df.columns.str[0]]

print(merged_df)     

   A  B_1   C  B_2  B_3  D_1  B_4  D_2
0  3    6  11    5    0   13    9    1

Python相关问答推荐

如何使用函数正确索引收件箱?

Django序列化器没有验证或保存数据

Python中使用Delivercio进行多个请求

如何从格式为note:{neighbor:weight}的字典中构建networkx图?

如何将带有逗号分隔的数字的字符串解析为int Array?

pyautogui.locateOnScreen在Linux上的工作方式有所不同

拆分pandas列并创建包含这些拆分值计数的新列

为什么tkinter框架没有被隐藏?

查找两极rame中组之间的所有差异

可变参数数量的重载类型(args或kwargs)

管道冻结和管道卸载

Python,Fitting into a System of Equations

PyQt5,如何使每个对象的 colored颜色 不同?'

为一个组的每个子组绘制,

为什么np. exp(1000)给出溢出警告,而np. exp(—100000)没有给出下溢警告?

Maya Python脚本将纹理应用于所有对象,而不是选定对象

在Python中使用yaml渲染(多行字符串)

巨 Python :逆向猜谜游戏

如何在Python Pandas中填充外部连接后的列中填充DDL值

Python 3试图访问在线程调用中实例化的类的对象