gpt4 book ai didi

python - 如果其他 'better' 值存在于其他地方,则替换数据框列中的值

转载 作者:行者123 更新时间:2023-11-28 17:06:07 27 4
gpt4 key购买 nike

我有一个大致如下结构的数据框(它是事件参与者的列表;池足够小,我们可以假设重复值指的是同一个人):

id_1 id_2 id_3 ... year  name   country
1_c 2_a 3_a 2011 John France
1_b 2_a 3_c 2010 Jill UK
1_c 2_b 3_c 2018 John Germany
1_c 2_b 3_c 2014 Jason Italy
1_c 2_b 3_b 2017 John Unknown

目标是用国家名称替换“未知”值,如果该人在另一年的参与中有一个已知的国家。

在极不可能发生的情况下,他们在不同年份的不同国家/地区下列出,我很乐意将它们标记在最接近“未知”年份的年份(如上,我们会将约翰的“未知”更改为“德国”)。

我是一个完整的 pandas(和 python!)新手。我已经使用 drop_duplicates 创建了一个唯一名称/国家/地区对的列表,但我假设必须有一种比我目前深陷其中的困惑的列表、元组和字典转换更优雅的方式来完成剩下的工作。

最佳答案

通过 pd.DataFrame.apply 可以实现一个非矢量化 解决方案.这只是一个薄薄的面纱循环。我们循环遍历每一行。如果不知道国家/地区,我们:

  • 过滤 country 不等于“Unknown”且 name 等于行名称。
  • 计算该子集的每一年与行年份之间的绝对差异。
  • 检索 country 的最小绝对年份差异。

这是一个完整的例子:

def get_country(row):
if row['country'] != 'Unknown':
return row['country']
else:
res = df.loc[(df['country'] != 'Unknown') & (df['name'] == row['name'])]\
.assign(year_diff=(df['year']-row['year']).abs())
return res.loc[res['year_diff'].idxmin(), 'country'] if not res.empty else 'Unknown'

df['country'] = df.apply(get_country, axis=1)

print(df)

id_1 id_2 id_3 year name country
0 1_c 2_a 3_a 2011 John France
1 1_b 2_a 3_c 2010 Jill UK
2 1_c 2_b 3_c 2018 John Germany
3 1_c 2_b 3_c 2014 Jason Italy
4 1_c 2_b 3_b 2017 John Germany

肯定会有巧妙的方法来优化使用 Pandas/NumPy,例如通过排序。如果性能是一个问题,您应该考虑替代算法。

关于python - 如果其他 'better' 值存在于其他地方,则替换数据框列中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50890074/

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