Python:查找数据帧中特定列值总和为0的所有行
我想提取数据帧中的所有行,其中这些分组行的特定列的总和为0 如果我有以下行:Python:查找数据帧中特定列值总和为0的所有行,python,numpy,Python,Numpy,我想提取数据帧中的所有行,其中这些分组行的特定列的总和为0 如果我有以下行: Row 1 1000 Row 2 -1000 Row 3 6000 Row 4 8000 我将第1行和第2行分组,因为列的和为0(+1000-1000=0) 如何在python中实现这一点?如何使用numpy实现这一点?为了获得更具指导性的结果,我将您的示例数据帧扩展到: Id Amount 0 1 1000 1 2 -1000 2 3 -5000 3 4 6000 4
Row 1 1000
Row 2 -1000
Row 3 6000
Row 4 8000
我将第1行和第2行分组,因为列的和为0(+1000-1000=0)
如何在python中实现这一点?如何使用numpy实现这一点?为了获得更具指导性的结果,我将您的示例数据帧扩展到:
Id Amount
0 1 1000
1 2 -1000
2 3 -5000
3 4 6000
4 5 8000
5 6 -2000
6 7 -4000
7 8 -2000
8 9 1500
9 10 500
您可以通过以下方式生成“边界行索引对”:
result = []
# Starting from each row, except the last
for i in range(df.index.size - 1):
# Compute expanding sum
s = df.iloc[i:].expanding().Amount.sum()
# Find indices of zeroes
ind = s[s == 0].index
# Append "start == i, end == j" to the result
result.extend([ [i, j] for j in ind ])
结果是:
[[0, 1], [1, 3], [1, 7], [4, 7], [7, 9]]
From 0 to 1:
Id Amount
0 1 1000
1 2 -1000
Sum: 0
From 1 to 3:
Id Amount
1 2 -1000
2 3 -5000
3 4 6000
Sum: 0
From 1 to 7:
Id Amount
1 2 -1000
2 3 -5000
3 4 6000
4 5 8000
5 6 -2000
6 7 -4000
7 8 -2000
Sum: 0
From 4 to 7:
Id Amount
4 5 8000
5 6 -2000
6 7 -4000
7 8 -2000
Sum: 0
From 7 to 9:
Id Amount
7 8 -2000
8 9 1500
9 10 500
Sum: 0
[[0, 1], [1, 3], [4, 7], [7, 9]]
要检索、打印和检查显示的行“范围”,请运行:
for i, j in result:
print(f'From {i} to {j}:')
print(df.iloc[i:j+1])
print(f'Sum: {df.iloc[i:j+1].Amount.sum()}\n')
结果是:
[[0, 1], [1, 3], [1, 7], [4, 7], [7, 9]]
From 0 to 1:
Id Amount
0 1 1000
1 2 -1000
Sum: 0
From 1 to 3:
Id Amount
1 2 -1000
2 3 -5000
3 4 6000
Sum: 0
From 1 to 7:
Id Amount
1 2 -1000
2 3 -5000
3 4 6000
4 5 8000
5 6 -2000
6 7 -4000
7 8 -2000
Sum: 0
From 4 to 7:
Id Amount
4 5 8000
5 6 -2000
6 7 -4000
7 8 -2000
Sum: 0
From 7 to 9:
Id Amount
7 8 -2000
8 9 1500
9 10 500
Sum: 0
[[0, 1], [1, 3], [4, 7], [7, 9]]
从12:52Z开始编辑以下注释
如果您只想要“叶级”范围(不包括在更大范围内)
然后,在找到一些零的索引(在滚动和中)之后,您应该
仅报告第一个范围,因为其他范围仅包括
已报告的范围
因此,代码应更改为:
result = []
# Starting from each row, except the last
for i in range(df.index.size - 1):
# Compute expanding sum
s = df.iloc[i:].expanding().Amount.sum()
# Find indices of zeroes
ind = s[s == 0].index
if ind.size > 0: # Something found
result.append([i, ind[0]]) # Append "from i to the first 'zero row'"
请注意:
- 我添加了if,以避免在没有“零和”的情况下出现“索引超出范围”异常 已经找到了,
- 已将extend更改为append,因为:
- 在以前的版本中,我希望对列表进行“分解” 每一对分别添加到结果中
- 现在我只添加了一个单个对,它不应该被“分解”
[[0, 1], [1, 3], [1, 7], [4, 7], [7, 9]]
From 0 to 1:
Id Amount
0 1 1000
1 2 -1000
Sum: 0
From 1 to 3:
Id Amount
1 2 -1000
2 3 -5000
3 4 6000
Sum: 0
From 1 to 7:
Id Amount
1 2 -1000
2 3 -5000
3 4 6000
4 5 8000
5 6 -2000
6 7 -4000
7 8 -2000
Sum: 0
From 4 to 7:
Id Amount
4 5 8000
5 6 -2000
6 7 -4000
7 8 -2000
Sum: 0
From 7 to 9:
Id Amount
7 8 -2000
8 9 1500
9 10 500
Sum: 0
[[0, 1], [1, 3], [4, 7], [7, 9]]
请注意,尚未添加范围[1,7](存在于第一种溶液中)
因此,现在您只有不包括其他范围的范围。是否还要将两行以上的行分组?例如:R1:1,R2:- 1,R3:10,R4:- 10 ->R1:0?你想只考虑相邻行还是R1和R2如果它们在第一和第三位置仍然分组?是的,它可以是任意数量的行/行,但是总数应该是0@Lukas Thaler:是的……我想把r1和r2分组,即使在第1和第3条中有position@LazlooXp:是的,在你提到的例子中,r1和r2会组成一个组,比如G1和r3,r4会组成另一个组,比如G2。或者它可以是r1+r2+r3+r4=0和一个组(G1)非常感谢你Valdi_Bo:)Valdi_Bo:你能帮我做其他版本吗?一旦你把r1和r2作为一个组的一部分,我就不想被包括在其他组中。在我的例子中,1000和-1000已经分组,所以我不希望它们成为更大组的一部分。优先考虑的是小团体。非常感谢瓦尔迪奥·波。实际上,我在下面的数据帧上尝试了这个方法:Amount 0 1000 1-1000 2 2000 3 2000 4 2000 5-2000 6-3000,它继续给我提供其他范围内的行…我想我需要检查一下,看看结果中是否已经存在索引。如果是,则排除rangeHi Valdi_Bo:我尝试了这个方法,用于以下数量。不适用于此。你能帮忙吗金额1000-32024.43 134.92-2000 31889.51-2000-1000行1和7组成一个组,行2,3,5组成另一个组,行4,6格式a组我的代码检查连续值的总和。不考虑“第1行和第7行”这样的情况。要执行这样的搜索,您应该生成不重复的组合。但很难说一个这样的“群体”是否包括另一个群体。还请注意,在您的帖子中,您最初介绍了一个仅包含连续元素的案例,因此我假设这是代码应该使用的方式。