我创建两个数据框:
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
为什么只有名字(约翰)填写了身高?不应该apply()遍历df1的所有行并从df2返回高度(其中df2与df1的当前行中的名称匹配)吗?
问题是df2[df2.Name == row.Name]['Height']
返回具有不同索引的序列。当熊猫连接这些系列时,会产生不同的列。特别是:
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)
但是,这当然不是解决问题的最佳方法。您应该看看map
或merge
。例如:
df1['Height'] = df1['Name'].map(df2.set_index('Name')['Height'])
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句