Pandas 按值的 cumsum 长度分组与索引的长度不匹配

Pandas group by cumsum length of values does not match length of index

随着这些帮助问题的大部分开始,我是 Python 和 Pandas 的新手。我一直在边做边学,尤其是当我有一项特定任务要完成时。我搜索了帮助页面,但找不到针对特定问题的答案,而且我无法根据类似问题的答案设计解决方案。

我有一个包含 50K+ 个条目的数据集。一般格式为:

    code  value
0    101    0.0
1    102    0.0
2    103   23.2
3    104   10.3
4    105    0.2
5    106    0.0
6    107   22.6
7    108    0.0
8    109    0.0
9    110    2.2
10   111    3.8
11   112    0.0

我的第一个任务是分离连续的非零值。通过反复试验,我设法将我的脚本压缩成一行来完成这一任务。

df[df['value'] != 0].groupby((df['value'] == 0).cumsum())
for grp, val in df[df['value'] != 0].groupby((df['value'] == 0).cumsum()):
    print(f'[group {grp}]')
    print(val)

输出为:

[group 2]
   code  value
2   103   23.2
3   104   10.3
4   105    0.2
[group 3]
   code  value
6   107   22.6
[group 5]
    code  value
9    110    2.2
10   111    3.8

我要对这个数据集进行其他操作和计算,我认为访问这些数据的最简单方法是将 groupby 对象转换为列(如果这是正确的术语?),就像这样:

   code  value  group
0   103   23.2      2
1   104   10.3      2
2   105    0.2      2
3   107   22.6      3
4   110    2.2      5
5   111    3.8      5

显然,我收到“值的长度与索引的长度不匹配”错误。我搜索了帮助页面,似乎我需要执行某种类型的 reset_index 方法。在过去一天半的时间里,我尝试了其他线程中建议的各种语法结构和许多其他编码解决方案,但都没有成功。当我从短暂的休息回来发现我的猫在键盘上滚动,在我一直在测试的脚本片段中添加和删除乱码时,我终于决定放弃并寻求帮助。

如果有人愿意帮助我完成这个脚本——将 groupby 对象放入列中,我将不胜感激。谢谢。

这将为您提供组,然后删除零行。

df = pd.DataFrame({'code': [101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112],
 'value': [0.0, 0.0, 23.2, 10.3, 0.2, 0.0, 22.6, 0.0, 0.0, 2.2, 3.8, 0.0]})

df['group'] = df.value.eq(0).cumsum()
df = df.loc[df.value.ne(0)]

输出

    code  value  group
2    103   23.2      2
3    104   10.3      2
4    105    0.2      2
6    107   22.6      3
9    110    2.2      5
10   111    3.8      5