gpt4 book ai didi

python - pandas 高效合并和更新

转载 作者:行者123 更新时间:2023-11-28 20:30:03 24 4
gpt4 key购买 nike

我正在从数据库中获取 df1。df2 需要与 df1 合并。 Df1 包含 df2 中不存在的其他列。 df2 包含 df1 中已经存在的索引以及需要更新的行。数据框是多索引的。

我想要什么:-保留 df1 中不在 df2 中的行-用 df2 的值更新 df1 的值以匹配索引- 在更新的行中保留 df2 中不存在的列的值。-追加在 df2 但不在 df1 中的行

我的解决方案:

import pandas as pd
import numpy as np

df1 = pd.DataFrame(
data={'idx1': ['A', 'B', 'C', 'D', 'E'], 'idx2': [1, 2, 3, 4, 5], 'one': ['df1', 'df1', 'df1', 'df1', 'df1'],
'two': ["y", "x", "y", "x", "y"]})

df2 = pd.DataFrame(data={'idx1': ['D', 'E', 'F', 'G'], 'idx2': [4, 5, 6, 7], 'one': ['df2', 'df2', 'df2', 'df2']})

desired_result = pd.DataFrame(data={'idx1': ['A', 'B', 'C', 'D', 'E', 'F', 'G'], 'idx2': [1, 2, 3, 4, 5, 6, 7],
'one': ['df1','df1','df1','df2', 'df2', 'df2', 'df2'], 'two': ["y", "x", "y", "x", "y",np.nan,np.nan]})



updated = pd.merge(df1[['idx1', 'idx2']], df2, on=['idx1', 'idx2'], how='right')
keep = df1[~df1.isin(df2)].dropna()
my_res = pd.concat([updated, keep])
my_res.drop(columns='two', inplace=True)

my_res = pd.merge(my_res,df1[['idx1','idx2','two']], on=['idx1','idx2'])

这是非常低效的,因为我:

  1. 通过右外连接将 df2 合并到 df1 的仅索引列

  2. 查找 df2 中但不在 df1 中的索引

  3. 连接两个数据帧

  4. 删除未包含在 df2 中的列

  5. 在索引上合并以追加我之前删除的那些列

是否有更有效、更简单的方法来做到这一点?我就是无法解决这个问题。

编辑:通过 mutliindexed 我的意思是要识别一行我需要查看 4 个不同的列组合。不幸的是,我的解决方案无法正常工作。

最佳答案

Merge数据框,update使用 one_ 中的值的 one 列,然后删除此临时列。

df = df1.merge(df2, on=['idx1', 'idx2'], how='outer', suffixes=['', '_'])
df['one'].update(df['one_'])
>>> df.drop(columns=['one_'])
idx1 idx2 one two
0 A 1 df1 y
1 B 2 df1 x
2 C 3 df1 y
3 D 4 df2 x
4 E 5 df2 y
5 F 6 df2 NaN
6 G 7 df2 NaN

关于python - pandas 高效合并和更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58827663/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com