gpt4 book ai didi

python - 使用 df.merge 填充 df 中的新列给出奇怪的匹配项

转载 作者:太空宇宙 更新时间:2023-11-04 05:01:01 24 4
gpt4 key购买 nike

我刚发现导致此问题的 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

只有第一行是正确匹配的。你知道我错过了什么吗?

解决方案

1.我需要使用 how="left"进行合并,否则默认选择是“inner”,生成另一个维度与 df 不同的表。

  1. 我还需要使用 sort=false 作为我的合并函数的属性。否则合并结果在应用到 df 之前被排序。

最佳答案

您可以使用 mapset_indexsqueeze 执行此操作的一种方法:

df['Type2'] = df['Type'].map(df1.set_index('Type').squeeze())

输出:

   Type  Type2
0 22 23.0
1 56 57.0
2 63 64.0
3 33 34.0
4 25 26.0

关于python - 使用 df.merge 填充 df 中的新列给出奇怪的匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45737332/

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