我有2个 Dataframe df1, df2
。df1
具有列["id", "time", "cost", "quantity]
。df2
具有列["id", "time", "modified_cost", "modified_quantity]
。
我想将df2
合并到df1
中。目前我正在做
df1 = df1.merge(df2["id", "time", "modified_cost", "modified_quantity"], on=["id", "time"], how="left")
但是如果df2
没有与df1
相同的["id", "time"]
集合,那么这最终会填充NaN。
下面是一个例子:
import pandas as pd
df1 = pd.DataFrame({"id": [1,2,3,4], "time": [3, 4, 5, 6], "cost": [1.1, 2.2, 3.3, 4.4], "quantity": [10,20,30,40]})
df2 = pd.DataFrame({"id": [2,3,4], "time": [4, 5, 6], "modified_cost": [2.2, 3.3, 4.4], "modified_quantity": [20,30,40]})
df1 = df1.merge(df2, on=["id", "time"], how="left")
print(df1)
给予
id time cost quantity modified_cost modified_quantity
0 1 3 1.1 10 NaN NaN
1 2 4 2.2 20 2.2 20.0
2 3 5 3.3 30 3.3 30.0
3 4 6 4.4 40 4.4 40.0
而不是这样,我希望NaN成为cost
和quantity
列中的任何内容,因此
id time cost quantity modified_cost modified_quantity
0 1 3 1.1 10 1.1 10.0
1 2 4 2.2 20 2.2 20.0
2 3 5 3.3 30 3.3 30.0
3 4 6 4.4 40 4.4 40.0
合并时如何实现此行为?
目前,唯一的解决办法,我知道的是这样做后合并
df1.loc[df1.modified_cost.isna(), "modified_cost"] = df1[df1.modified_cost.isna()].cost
3条答案
按热度按时间gab6jxml1#
无法在
merge
函数中找到实现它的方法。但您可以使用apply
在一行中进行后处理。其想法是将'modified_xxx'替换为'xxx'。webghufk2#
在问题中,你展示了一种对merge()的结果进行后处理以获得所需结果的方法。还有一些方法可以使用mask()对df2进行预处理以获得所需结果,但它们不一定比你的解决方案更好。
例如,您可以执行以下操作:
......或者这个:
......或者这个:
可以说,上面的最后一个是最精简的预处理策略,因为在调用reindex()之后,对merge()的调用实际上只是用于追加列(而不是进行任何数据库风格的连接),这可以使用concat()实现。
yquaqz183#
基于用另一个 Dataframe 值填充 Dataframe 的答案。
我用
fillna
来做这个。加速时间
测试上述策略。