Python 每行的计数、总和、平均特定范围/值

Python 每行的计数、总和、平均特定范围/值,python,pandas,pandas-groupby,isin,Python,Pandas,Pandas Groupby,Isin,我有大数据,我想计算,求和,平均每行之间的特定范围 df = pd.DataFrame({'id0':[10.3,20,30,50,108,110],'id1':[100.5,0,300,570,400,140], 'id2':[-2.6,-3,5,12,44,53], 'id3':[-100.1,4,6,22,12,42]}) 例如,我想计算每行出现的值在10-100之间,因此它将得到: 0 1 1 1 2 1 3 3 4 2 5 2 Name: coun

我有大数据,我想计算,求和,平均每行之间的特定范围

df = pd.DataFrame({'id0':[10.3,20,30,50,108,110],'id1':[100.5,0,300,570,400,140], 'id2':[-2.6,-3,5,12,44,53], 'id3':[-100.1,4,6,22,12,42]})
例如,我想计算每行出现的值在10-100之间,因此它将得到:

0    1
1    1
2    1
3    3
4    2
5    2
Name: count_10-100, dtype: int64

目前,我通过对每一行进行迭代和使用groupby来实现这一点。但这需要一段时间,因为我有~500列和500000行

您可以在它们之间应用条件,然后沿着行(轴1)应用
sum


对于求和和和平均值,可以应用
中的条件,其中

df.where((df >= 10) & (df <= 100)).sum(axis=1)
df.where((df >= 10) & (df <= 100)).mean(axis=1)

df.where((df>=10)&(df=10)&(df)下面总结了您希望在数据帧(或系列,完整性)中计数的不同情况,以及推荐的方法

DataFrame.count
将每列的计数作为一个序列返回,因为非空计数随列而异。
DataFrameGroupBy.size
返回一个序列,因为同一组中的所有列共享相同的行计数。
DataFrameGroupBy.count
返回一个数据帧,因为同一组中不同列的非空计数可能不同。 要获取特定列的分组非空计数,请使用
df.groupby(…)['x'].count()
,其中“x”是要计数的列

#代码示例

df = pd.DataFrame({
    'A': list('aabbc'), 'B': ['x', 'x', np.nan, 'x', np.nan]})
s = df['B'].copy()

df

   A    B
0  a    x
1  a    x
2  b  NaN
3  b    x
4  c  NaN

s

0      x
1      x
2    NaN
3      x
4    NaN
Name: B, dtype: object
Row Count of a DataFrame: len(df), df.shape[0], or len(df.index)
len(df)
# 5

df.shape[0]
# 5

len(df.index)
# 5
在上述三种方法中,len(df.index)(如其他答案所述)是最快的

以上所有方法都是常量时间操作,因为它们是简单的属性查找。 shape(类似于ndarray.shape)是一个返回(#Rows,#Cols)元组的属性

数据帧的列计数:df.shape[1],len(df.columns)

与len(df.index)类似,len(df.columns)是两种方法中速度更快的(但需要更多的字符来输入)

序列的行计数:

len(s), s.size, len(s.index)

len(s)
# 5

s.size
# 5

len(s.index)
# 5
s、 大小和len(s.index)在速度方面大致相同,但我推荐len(df)

size是一个属性,它返回元素数(=任何系列的行数)。DataFrames还定义了一个size属性,该属性返回的结果与

df.shape[0] * df.shape[1].
非空行计数:DataFrame.Count和Series.Count 这里描述的方法只计算非空值(意味着忽略NAN)

调用DataFrame.count将为每列返回非NaN计数:

df.count()

A    5
B    3
dtype: int64
For Series, use Series.count to similar effect:

s.count()
# 3
分组行计数:GroupBy.size 对于DataFrames,请使用DataFrameGroupBy.size来计算每个组的行数

df.groupby('A').size()

A
a    2
b    2
c    1
dtype: int64
类似地,对于Series,您将使用SeriesGroupBy.size

s.groupby(df.A).size()

A
a    2
b    2
c    1
Name: B, dtype: int64
在这两种情况下,都会返回一个序列

分组非空行计数:GroupBy.Count 与上面类似,但使用GroupBy.count,而不是GroupBy.size。请注意,size始终返回一个序列,而count在对特定列或数据帧调用时返回一个序列

以下方法返回相同的结果:

df.groupby('A')['B'].size()
df.groupby('A').size()

A
a    2
b    2
c    1
Name: B, dtype: int64



df.groupby('A').count()

   B
A
a  2
b  1
c  0



df.groupby('A')['B'].count()

A
a    2
b    1
c    0
Name: B, dtype: int64

通过聚合和使用pandas方法,有一种简洁的方法可以做到这一点。它可以理解为“按行聚合(轴=1),其中x大于或等于10,小于或等于100”


像这样的东西会对你有帮助

df["n_values_in_range"] = df.apply(
    func=lambda row: count_values_in_range(row, range_min, range_max), axis=1)
试试这个:

df.apply(lambda x: x.between(10, 100), axis=1).sum(axis=1)
输出:

0    1
1    1
2    1
3    3
4    2
5    2
dtype: int64
0    1
1    1
2    1
3    3
4    2
5    2
df.agg(lambda x : (x.ge(10) & x.le(100)).sum(), axis=1)
df["n_values_in_range"] = df.apply(
    func=lambda row: count_values_in_range(row, range_min, range_max), axis=1)
df.apply(lambda x: x.between(10, 100), axis=1).sum(axis=1)
0    1
1    1
2    1
3    3
4    2
5    2