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

标签 python python-2.7 pandas dataframe

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

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/

相关文章:

Python AST 处理

python - pyqt4 : AttributeError: 'QPlainTextEdit' object has no attribute 'text'

python-2.7 - Selenium XPATH 已找到子 div 标签,如何转到包含文本参数的父标签

python - 如何让 SWIG 在 Python 2 中返回字符串的 unicode 对象?

python - 如何在索引上绘制散点图作为 x 值

python - 值错误: cannot convert float NaN to integer after already using dropna()

python - 测试 - 如何让所有记录器打印输出

Python错误: 'NoneType' object has no attribute 'find_all'

python - 如何从异步方法/线程传递/交换数据?

python-3.x - 线性回归中与一个特征的每次交互都会增加梯度下降成本