Pandas groupby不合并非连续同组数据的实现方法咨询
如何在Pandas中实现连续同组统计
嘿,这个问题我之前在处理时序类连续分组数据时也遇到过!默认的Pandas groupby是全局分组——不管行的顺序,只要值相同就归为一组,这显然不是你想要的连续同组统计效果。咱们来一步步解决它:
第一步:先清理数据(关键!)
你提供的原始数据里,逗号后面带了空格,直接读入后country列会包含多余的空格(比如' USA'而不是'USA'),这会导致分组出错。所以首先要清理列中的空格:
from io import StringIO import pandas as pd myst="""india, 905034 , 19:44 USA, 905094 , 19:33 Russia, 905154 , 21:56 USA, 345345, 45:55 USA, 34535, 65:45""" u_cols=['country', 'index', 'current_tm'] df = pd.read_csv(StringIO(myst), sep=',', names=u_cols) # 清理各列的多余空格 for col in u_cols: df[col] = df[col].str.strip()
第二步:生成连续分组的标识
核心思路是:给连续相同的country行打上同一个分组ID。我们可以用ne()(不等于)判断当前行和上一行的country是否不同,再用cumsum()累加得到分组ID:
# 创建连续分组标识:连续相同country的行拥有相同group_id df['group_id'] = df['country'].ne(df['country'].shift()).cumsum()
解释一下:
df['country'].shift()会把上一行的country值移到当前行ne()比较当前行和上一行的country,不同则返回True(等价于1),相同则返回False(等价于0)cumsum()累加这些值,这样连续相同的country就会被分到同一个group_id里
第三步:按连续分组统计
现在用country和group_id一起分组,就能得到连续同组的统计结果了:
# 按country和group_id分组,统计每组的行数 continuous_count = df.groupby(['country', 'group_id'], sort=False).size() # 去掉group_id索引,得到你想要的格式 continuous_count = continuous_count.reset_index(level='group_id', drop=True) print(continuous_count)
运行后输出就是你期望的结果:
country india 1 USA 1 Russia 1 USA 2 dtype: int64
为什么默认groupby不行?
默认的df.groupby('country', sort=False).size()会把所有country为USA的行归为一组,不管它们是否连续。而我们通过group_id把不连续的USA分成了两个独立的组,这样统计出来的就是连续段的数量了。
内容的提问来源于stack exchange,提问作者shantanuo
相关产品推荐
相关产品推荐

