gpt4 book ai didi

pandas 在使用逻辑索引时只应用返回第一个值

转载 作者:行者123 更新时间:2023-12-04 15:16:52 24 4
gpt4 key购买 nike

我创建了两个数据框:

data = [['John'], ['Mary']]
df1 = pd.DataFrame(data, columns = ['Name'])
df1['Height'] = 0

data = [['John', 5], ['Mary', 6]]
df2 = pd.DataFrame(data, columns = ['Name', 'Height'])

df1

Output:

Name Height
0 John 0
1 Mary 0

df2

Output:
Name Height
0 John 5
1 Mary 6

现在我尝试使用 df2 中的值填充 df1 的高度:

df1['Height'] = df1.apply(lambda row: df2[df2.Name == row.Name]['Height'], axis = 1)

df1

Output:
Name Height
0 John 5
1 Mary Nan

为什么只有名字 (John) 填写了高度? apply() 不应该遍历 df1 的所有行并从 df2 返回高度,其中 df2 与 df1 当前行中的名称匹配吗?

最佳答案

问题在于 df2[df2.Name == row.Name]['Height'] 返回具有不同索引的系列。当 Pandas 连接这些系列时,您会产生不同的列。特别是:

df1.apply(lambda row: df2[df2.Name == row.Name]['Height'], axis = 1)

返回:

     0    1
0 5.0 NaN
1 NaN 6.0

当您这样做时,Pandas 似乎会占用第一列进行分配:

df['Height'] = ...

要修复您的代码,您需要提取单个值:

df1['Height'] = df1.apply(lambda row: df2[df2.Name == row.Name]['Height'].iloc[0], axis = 1)

但是,这肯定不是解决问题的最佳方法。您应该看看 mapmerge。例如:

df1['Height'] = df1['Name'].map(df2.set_index('Name')['Height'])

关于pandas 在使用逻辑索引时只应用返回第一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64163283/

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