python - DataFrame列的分类和计数怎么做?
问题描述
我想计算连续0
的s,如果有0
s,count
连续的数字,并将数字分配给count
列,如果它们遇到1
,recount
。
我也尝试了几种方法,但都没有达到我的效果。
我的数据框的一个例子如下:
import numpy as np
import pandas as pd
np.random.seed(2021)
a = np.random.randint(0, 2, 20)
df = pd.DataFrame(a, columns=['No.'])
print(df)
No.
0 0
1 1
2 1
3 0
4 1
5 0
6 0
7 0
8 1
9 0
10 1
11 1
12 1
13 1
14 0
15 0
16 0
17 0
18 0
19 0
我需要的结果:
No. count
0 0 1
1 1 0
2 1 0
3 0 1
4 1 0
5 0 3
6 0 3
7 0 3
8 1 0
9 0 1
10 1 0
11 1 0
12 1 0
13 1 0
14 0 6
15 0 6
16 0 6
17 0 6
18 0 6
19 0 6
我尝试了以下方法,但都没有达到我的效果。我应该怎么办?
groups = df['No.'].ne(0).cumsum()
df['count'] = df['No.'].eq(0).groupby(groups).count()
df['count'] = df['No.'].eq(0).groupby(groups).agg(len)
df['count'] = df['No.'].groupby(groups).agg(len)
df['count'] = df['No.'].groupby(groups).count()
解决方案
对于您的groups
变量,首先计算,因此您为每个包含相同值的连续序列diff
分配一个。并且要获得可以分配给原始数据框id
的相同大小的系列,请使用而不是:count
transform
agg
df['count'] = 0
groups = df['No.'].diff().ne(0).cumsum()
df.loc[df['No.'] == 0, 'count'] = df['No.'].groupby(groups).transform('size')
df
No. count
0 0 1
1 1 0
2 1 0
3 0 1
4 1 0
5 0 3
6 0 3
7 0 3
8 1 0
9 0 1
10 1 0
11 1 0
12 1 0
13 1 0
14 0 6
15 0 6
16 0 6
17 0 6
18 0 6
19 0 6
推荐阅读
- python - Python - 从文件夹中删除 xlsx 文件
- excel - 为什么它说没有for循环?
- .net - 如果一个正则表达式匹配组值在另一个匹配组值内,正则表达式不会返回所有组?
- javascript - 有没有办法修改 JSTree 以部分阻止 HTML 执行,而不是简单地将“force_text”设置为 true?
- reactjs - 找不到带有材料 ui 示例的模块 react-select
- dask - 获取 Dask 分布式客户端的 Dask 诊断值
- java - 没有 SpringBoot 的 Spring Boot Actuator 2.1.6 的 XML 配置
- java - 在 Spring Boot 应用程序的 JUnit 测试中,自动装配的 JPA 存储库没有合格的 bean
- c# - 如何在 xamarin.forms 中添加带有 refit 的静态授权标头?
- javascript - “让”吊起来了吗?