如何用Python中的另一个 Dataframe 替换基于公共主键的Pandas Dataframe 中的特定单元格?

iszxjhcz  于 2023-05-27  发布在  Python
关注(0)|答案(3)|浏览(212)

在中断了4年之后,我正在尝试用Python编写代码,并且在实现我的想法时遇到了困难。我有两个大的excel表,其中包含超过12k x 70的值,两者都有相同的列数和列名。我已经为两个 Dataframe 创建了一个主键,现在我想比较一个工作表的主键与另一个工作表的主键的值,当有匹配时,我想将旧工作表中的某些值(不是全部)替换到新工作表中。
例如df1:

A   B   C   D   E   F
1   2   3   4   5   6
7   8   9   10  11  12
13  14  15  16  17  18

df2:

A   B   C   D   E   F
19  20  21  22  23  6
25  26  27  28  29  12  
31  32  33  34  35  19

当操作完成后,我需要它看起来像这样的df1:

A   B   C   D   E   F
1   2   21  22  23  6
7   8   27  28  29  12  
13  14  15  16  17  18

列F是主键
我尝试了以下方法,但它给出了一个非常奇怪的输出

for i in df2['F']:
    for j in df1['F']:
        if i==j:
            df1['D'] = df2['D'].astype(str)            
            df1['E'] = df2['E'].astype(str)
            df1['C'] = df2['C'].astype(str)
4zcjmb1e

4zcjmb1e1#

可以使用update

cols = ['C', 'D', 'E']

df3 = df1.set_index('F')[cols]
df3.update(df2.set_index('F')[cols])

df1[cols] = df3[cols].astype(df1[cols].dtypes).values

输出:

>>> df1
    A   B   C   D   E   F
0   1   2  21  22  23   6
1   7   8  27  28  29  12
2  13  14  15  16  17  18
uplii1fm

uplii1fm2#

定制合并到您似乎想要从每个输入 Dataframe 中获得的列:

df1 = df1[['A','B','F']].merge(df2[['C','D','E','F']], on='F', how='inner')

这将在df1和df2共有的F列的匹配值上合并。

zhte4eai

zhte4eai3#

Merge可以用于:

new_df = df1.merge(df2, on='F')

请注意,如果两个 Dataframe 具有相同的列名,则new_df将包含带有'_x'和'_y'后缀的新列名。
合并后,您可以决定保留哪些列
要仅复制存在的值,您可以:

import numpy as np
new_df['A_x'] = np.where(new_df['A_y'].isnull(), new_df['A_x'], new_df['A_y'])

仅当新值不为空时,它才会更新单元格

相关问题