繁体   English   中英

计算每列的 pandas.DataFrame 行数

[英]Counting the number of pandas.DataFrame rows for each column

我想做的事

我想计算有条件的行数。 每列应该有不同的数字。

import numpy as np
import pandas as pd

## Sample DataFrame
data = [[1, 2], [0, 3], [np.nan, np.nan], [1, -1]]
index = ['i1', 'i2', 'i3', 'i4']
columns = ['c1', 'c2']
df = pd.DataFrame(data, index=index, columns=columns)
print(df)

## Output
#      c1   c2
# i1  1.0  2.0
# i2  0.0  3.0
# i3  NaN  NaN
# i4  1.0 -1.0

## Question 1: Count non-NaN values
## Expected result
# [3, 3]

## Question 2: Count non-zero numerical values
## Expected result
# [2, 3]

注意:结果的数据类型并不重要。 它们可以是列表,pandas.Series,pandas.DataFrame 等(无论如何我都可以转换数据类型。)

我检查过的

## For Question 1
print(df[df['c1'].apply(lambda x: not pd.isna(x))].count())

## For Question 2
print(df[df['c1'] != 0].count())

显然,这两个print功能仅适用于c1列。 很容易一栏一栏地检查。 我想知道是否有一种方法可以一次计算所有列的计数。

环境

Python 3.10.5
pandas 1.4.3

您不会使用apply迭代您的数据。 您可以以矢量化方式实现您的结果:

print(df.notna().sum().to_list()) # [3, 3]
print((df.ne(0) & df.notna()).sum().to_list()) # [2, 3]

请注意,我假设“问题 2:计算非零值”也排除了nan值,否则您将得到[3, 4]

我认为你很接近:回答你的第一个问题:

>>> df.apply(lambda x : x.isna().sum(), axis = 0)
c1    1
c2    1
dtype: int64

您更改为 axis = 1 以在每一行上应用此操作。

要回答你的第二个问题,这是从这里开始的(已经回答了关于 SO 的问题):


>>> df.astype(bool).sum(axis=0)
c1    3
c2    4
dtype: int64

同样,如果需要,您可以将轴更改为 1...

希望能帮助到你 !

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM