【问题标题】:Replace Nulls in DataFrame with Max in Row将 DataFrame 中的 Null 替换为 Row 中的 Max
【发布时间】:2015-10-20 19:16:18
【问题描述】:

有没有办法(比使用 for 循环更有效)将 Pandas 的 DataFrame 中的所有空值替换为其相应行中的最大值。

【问题讨论】:

  • “更高效”是什么意思?您尝试做的事情的时间复杂度无法从基本实现(遍历每一行,计算最大值,用最大值填充空值)改进,因为您需要至少查看每个元素一次。
  • 通常使用 Pandas,您可以使用内部优化函数一次对整个帧执行操作,这些函数比自己循环遍历帧更快。例如, df.mul(df2) 比同时遍历帧并在 python 中进行乘法运算要快。类似于 numpy 的工作原理。

标签: python pandas dataframe missing-data


【解决方案1】:

我想这就是你要找的:

import pandas as pd  

df = pd.DataFrame({'a': [1, 2, 0], 'b': [3, 0, 10], 'c':[0, 5, 34]})


   a   b   c
0  1   3   0
1  2   0   5
2  0  10  34

您可以使用apply,遍历所有行并使用replace 函数将0 替换为行的最大数量,从而为您提供预期的输出:

df.apply(lambda row: row.replace(0, max(row)), axis=1)

    a   b   c
0   1   3   3
1   2   5   5
2  34  10  34

如果您想替换 NaN - 根据您的评论,这似乎是您的实际目标 - you can use

df = pd.DataFrame({'a': [1, 2, np.nan], 'b': [3, np.nan, 10], 'c':[np.nan, 5, 34]})

     a     b     c
0  1.0   3.0   NaN
1  2.0   NaN   5.0
2  NaN  10.0  34.0

df.T.fillna(df.max(axis=1)).T

屈服

      a     b     c
0   1.0   3.0   3.0
1   2.0   5.0   5.0
2  34.0  10.0  34.0

这可能比

更有效(尚未完成计时)
df.apply(lambda row: row.fillna(row.max()), axis=1)

请注意

df.apply(lambda row: row.fillna(max(row)), axis=1)

here 所述,不适用于每种情况。

【讨论】:

  • df.apply(lambda row: row.fillna(max(row)), axis=1) 成功了。谢谢。
  • @rhaskett:已经有一段时间了,但请查看我的更新。
  • 有趣。幸运的是,该代码早已不复存在,但这可能是一个令人讨厌的错误。
猜你喜欢
  • 2017-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-09
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 2022-06-13
相关资源
最近更新 更多