【问题标题】:How to count the number of non-NaN columns in a row in a Dataframe?如何计算数据框中一行中非 NaN 列的数量?
【发布时间】:2020-02-03 03:39:29
【问题描述】:

我有一个有 15 列的 DataFrame。大多数列是NaN。我想要一个新列显示每行中有多少 NaN 列。

输入:

  0 1 3
a 1 4 NaN
b 2 5 7
c 3 6 NaN

输出:

  0 1 3    number_of_non_nans
a 1 4 NaN  2
b 2 5 7    3
c 3 6 NaN  2

Pandas 有 sum() 但我不知道如何应用它。它似乎只能对实际值求和。

df_f['number_of_non_nans'] = df_f.sum(1, axis=1)

有没有办法计算非 NaN?

【问题讨论】:

  • 您可以将带有 numpy .isna() 函数的 lambda 应用到数据框并按行或列求和。
  • 只需 df.count(axis=1) 就可以了,它只会计算 True 值。
  • 或 df.isna() 熊猫函数
  • 结合@Datanovice 的建议,它应该是 df.isna().count(axis=1)。
  • @Datanovice 解决方案已完成。 Count 仅计算“非 nan”值。无需在前面添加 isna。

标签: python pandas


【解决方案1】:

使用,

df['Number_of_non_nans'] = df.notna().sum(axis=1)

或者正如@Datanovice 在 cmets 中建议的那样使用:

 df['Number_of_non_nans'] = df.count(axis=1)

输出:

|    |   0 |   1 |   3 |   Number_of_non_nans |
|----|-----|-----|-----|----------------------|
| a  |   1 |   4 | nan |                    2 |
| b  |   2 |   5 |   7 |                    3 |
| c  |   3 |   6 | nan |                    2 |

时间:

%timeit df.count(axis=1)

656 µs ± 14.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops
> each)

%timeit df.isna().sum(axis=1)

> 437 µs ± 3.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

【讨论】:

    猜你喜欢
    • 2016-04-09
    • 2015-07-10
    • 2022-12-17
    • 2015-09-23
    • 2015-03-13
    • 1970-01-01
    • 2016-02-27
    • 1970-01-01
    相关资源
    最近更新 更多