我有两个dfs:

df_1

date            id          value
2021-01-01      A1          100
2021-01-01      A1          200
2021-01-01      A1          300
2021-01-02      A1          100
2021-01-02      A1          200
2021-01-03      A1          500
2021-01-03      A1          800

df_2

date            id          value_to_add
2021-01-01      A1          150 
2021-01-03      A1          350 

我试图保持df_1的 struct ,并在合并过程中在第一次出现时添加value_to_add,以便在用0填充NaN和除第一个值以外的所有值后,最终结果如下所示:

date            id          value       value_to_add
2021-01-01      A1          100         150 
2021-01-01      A1          200         0               # 0 because the 150 have been already added
2021-01-01      A1          300         0
2021-01-02      A1          100         0               # 0 because value_to_add does not exist
2021-01-02      A1          200         0
2021-01-03      A1          500         350 
2021-01-03      A1          800         0               # 0 because the 350 have been already added

我的第一个 idea 是删除['date', 'id']个子集的副本,然后将df_2合并到其中,但我不确定如何回到df_1的原始 struct .

所以问题是以下-being able to merge on the first occurrence of keys during 100 operation.我在这个话题上找不到任何东西,坦率地说,我不确定如何才能做到这一点.

推荐答案

您可以使用反转掩码将重复值过滤DataFrame.duplicated,并使用Index.union来避免从merge中删除新添加的列:

df_1.loc[~df_1.duplicated(['date', 'id']),
         df_1.columns.union(df_2.columns)] = df_1.merge(df_2, how='left')
df_1 = df_1.fillna(0)
print (df_1)
         date  id  value  value_to_add
0  2021-01-01  A1    100         150.0
1  2021-01-01  A1    200           0.0
2  2021-01-01  A1    300           0.0
3  2021-01-02  A1    100           0.0
4  2021-01-02  A1    200           0.0
5  2021-01-03  A1    500         350.0
6  2021-01-03  A1    800           0.0

助手计数器栏的另一个 idea :

df_1 = df_1.assign(g = df_1.groupby(['date', 'id']).cumcount()).merge(df_2.assign(g=0), how='left')
df_1 = df_1.drop('g', 1).fillna(0)
print (df_1)
         date  id  value  value_to_add
0  2021-01-01  A1    100         150.0
1  2021-01-01  A1    200           0.0
2  2021-01-01  A1    300           0.0
3  2021-01-02  A1    100           0.0
4  2021-01-02  A1    200           0.0
5  2021-01-03  A1    500         350.0
6  2021-01-03  A1    800           0.0

Python相关问答推荐

如何在Pandas 中存储二进制数?

获取Azure Pipelines以从pyproject.toml(而不是relevments_dev.文本)安装测试环境

telegram 机器人API setMyName不起作用

如果AST请求默认受csref保护,那么在Django中使用@ system_decorator(csref_protect)的目的是什么?

机器人与Pyton Minecraft服务器状态不和

Image Font生成带有条形码Code 128的条形码时出现枕头错误OSErsor:无法打开资源

在for循环中仅执行一次此操作

如何在Python中使用io.BytesIO写入现有缓冲区?

Pandas 第二小值有条件

我从带有langchain的mongoDB中的vector serch获得一个空数组

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

如何过滤包含2个指定子字符串的收件箱列名?

当从Docker的--env-file参数读取Python中的环境变量时,每个\n都会添加一个\'.如何没有额外的?

在Python中,从给定范围内的数组中提取索引组列表的更有效方法

将pandas导出到CSV数据,但在此之前,将日期按最小到最大排序

ConversationalRetrivalChain引发键错误

如何创建引用列表并分配值的Systemrame列

替换现有列名中的字符,而不创建新列

使用Openpyxl从Excel中的折线图更改图表样式

Pandas—堆栈多索引头,但不包括第一列