【问题标题】:Pandas dataframe avoid looping through columns and rowsPandas 数据框避免循环遍历列和行
【发布时间】:2021-08-20 20:03:54
【问题描述】:

我有一个包含几列的 df,看起来有点像这样:

A B C
NaN 3 2
6 4 NaN
2 4 NaN
1 NaN NaN
NaN NaN NaN
... ... ...

我现在想创建一个新列,它是列“A”乘以标量 (df['D'] = df['A']*3),但仅适用于那些没有 NaN 的行。在有 NaN 值的行中,我想使用 B 列的同一行,如果还有 NaN,我想使用 C 列,依此类推。如果所有列都有 NaN,则该值也应该是 NaN。

我可以使用 for 循环逐行检查上述 if 语句,但这对于大 df 来说似乎非常低效。有没有更有效的方法可以在这里使用?也许以某种方式使用 df.apply?

对不起,如果这个问题很明显。

【问题讨论】:

    标签: python pandas performance loops apply


    【解决方案1】:

    试试:

    df["D"] = df.bfill(axis=1)["A"] * 3
    print(df)
    

    打印:

         A    B    C     D
    0  NaN  3.0  2.0   9.0
    1  6.0  4.0  NaN  18.0
    2  2.0  4.0  NaN   6.0
    3  1.0  NaN  NaN   3.0
    4  NaN  NaN  NaN   NaN
    

    解释:

    您想将“A”列中的非 NaN 值相乘。因此,让我们首先尝试将“A”中的所有 NaN 值从正确的值填充到它。我们在任务行上使用bfill() 方法(回填)。然后将“A”列乘以 3。

    【讨论】:

    • 我花了一段时间才决定对此 +1,因为我阅读问题的方式是将 A 列(如果存在)相乘,如果不存在,则 B 列(不乘以标量)。但是,在重新阅读问题后,我认为我看错了,您的回答是正确的。
    • 哇,这看起来和我需要的完全一样,但我很难理解它是如何工作的。谢谢!编辑:好的,我知道了,非常感谢!
    猜你喜欢
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多