希望有人能帮助我解决这个问题。我有几个数据帧,其中包含相应的 id 和名称的值。对于每个 id,我想要所有数据帧的最大值,但现在我还必须为哪个名称出现此最大值。
该示例仅显示了两个数据帧,但我确实有大约 100 个数据帧,其中还包含大约 100 个 id,因此不能只取最大值,然后检查其中一个数据帧中包含哪些值并从那里获取名称。
我尝试过使用 groupby 但无法让它工作。
import pandas as pd
d1 = pd.DataFrame()
d2 = pd.DataFrame()
d1['id'] = [1,2,3,4,5]
d2['id'] = [1,2,3,4,5]
d1['max'] = [10,20,30,40,50]
d2['max'] = 25
d1['name'] = 'name_1'
d2['name'] = 'name_2'
df_max_list=[d1, d2]
df_max_out=pd.concat(df_max_list).groupby(level=0).max()
得到结果:
id max name
0 1 25 name_2
1 2 25 name_2
2 3 30 name_2
3 4 40 name_2
4 5 50 name_2
预期结果:
id max name
0 1 25 name_2
1 2 25 name_2
2 3 30 name_1
3 4 40 name_1
4 5 50 name_1
您可以将
id
设置为索引并使用 where
:
tmp1 = d1.set_index('id')
tmp2 = d2.set_index('id')
out = out = tmp1.where(tmp1['max'].gt(tmp2['max']), tmp2).reset_index()
如果您的数据框已经在
id
上对齐,您可以将上面的内容简化为:
out = d1.where(d1['max'].gt(d2['max']), d2)
输出:
id max name
0 1 25 name_2
1 2 25 name_2
2 3 30 name_1
3 4 40 name_1
4 5 50 name_1