问题描述
当大多数这些帮助问题开始时,我是 Python 和 Pandas 的新手。我一直在边做边学,尤其是当我有特定的任务要完成时。我搜索了帮助页面,但找不到针对特定问题的答案,也无法根据类似问题的答案设计解决方案。
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,22.6,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