我刚刚发现导致此问题的 2 个问题,请参阅下面的解决方案
我想基于另一个数据帧在我的数据帧(df)中创建一个新列。
基本上 df2 包含我想要插入 df 的更新信息。
为了复制我的真实情况(> 1m 行),我将用简单的列填充两个随机 df 。
我使用 pandas.merge() 来执行此操作,但这给了我奇怪的结果。
这是一个典型的例子。让我们随机创建 df 并使用简单的关系创建 df2 :“New Type”=“Type”+ 1。我创建这个简单的关系,以便我们可以轻松检查输出。当然,在我的实际应用中,我没有这么简单的关系。
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randint(0,100,size=(100, 1)),columns = ["Type"])
df.head()
Type
0 45
1 3
2 89
3 6
4 39
df1 = pd.DataFrame({"Type":range(1,100)})
df1["New Type"] = df1["Type"] + 1
print(df1.head())
Type New Type
0 1 2
1 2 3
2 3 4
3 4 5
4 5 6
现在假设我想根据 df1 上的“新类型”更新 df“类型”
df["Type2"] = df.merge(df1,on="Type")["New Type"]
print(df.head())
我得到这个奇怪的输出,我们清楚地看到它不起作用
Type Type2
0 45 46.0
1 3 4.0
2 89 4.0
3 6 4.0
4 39 90.0
我认为输出应该是这样的
Type Type2
0 45 46.0
1 3 4.0
2 89 90.0
3 6 7.0
4 39 40.0
只有第一行是正确匹配的。你知道我错过了什么吗?
Solution
1.我需要与 how="left" 进行合并,否则默认选择是“内部”,生成另一个维度与 df 不同的表。
- 另外,我需要使用 sort=false 作为合并函数的属性。否则,合并结果在应用于 df 之前先进行排序。