Python:查找数据帧中特定列值总和为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

我想提取数据帧中的所有行,其中这些分组行的特定列的总和为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   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行”这样的情况。要执行这样的搜索,您应该生成不重复的组合。但很难说一个这样的“群体”是否包括另一个群体。还请注意,在您的帖子中,您最初介绍了一个仅包含连续元素的案例,因此我假设这是代码应该使用的方式。