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
随着这些帮助问题的大部分开始,我是 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