[英]pandas.DataFrame: How to merge rows with a common column value in the same 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.