在DataFrame中用行最大值替换Null值

5
有没有一种方法(比使用for循环更有效)可以将Pandas的DataFrame中所有的null值替换为其各自行中的最大值。

“更有效率”是什么意思?你所尝试做的事情的时间复杂度无法从基本实现中改进(循环遍历每一行,计算最大值,用最大值填充空值),因为你至少需要查看每个元素一次。 - James
1
通常情况下,使用Pandas可以使用内部优化函数一次性对整个数据框执行操作,这比自己循环遍历数据框要快得多。例如,df.mul(df2)比同时循环遍历数据框并在Python中进行乘法运算要快。这类似于numpy的工作方式。 - rhaskett
1个回答

5
我想这就是你所寻找的:

我猜这就是你想要的:

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——根据你的评论似乎是你的实际目标——你可以使用

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

yielding

      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)

请注意,这里是关于IT技术的内容。请注意,
df.apply(lambda row: row.fillna(max(row)), axis=1)

正如这里所解释的那样,它并不在每种情况下都有效。


1
df.apply(lambda row: row.fillna(max(row)), axis=1) 做到了。谢谢。 - rhaskett
1
@rhaskett:已经有一段时间了,但请查看我的更新。 - Cleb
1
很有趣。幸运的是,那段代码早已消失了,但那可能是一个严重的错误。 - rhaskett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接