在sum列上拆分数据帧?

时间:2015-08-07 06:02:30

标签: python numpy pandas

我有一个像这样的DataFrame:

>>> df = pd.DataFrame({'Foo': [1, 2, 3, 6], 'Bar': ['hello', 'world', 'spam', 'eggs']})
>>> df
     Bar  Foo
0  hello    1
1  world    2
2   spam    3
3   eggs    6

如何拆分此DataFrame以使每个拆分部分(大致)具有Foo的相同总和?也就是说,如果我想将它们分成两部分,我想:

     Bar  Foo
0  hello    1
1  world    2
2   spam    3

     Bar  Foo
0   eggs    6

因为在这两种情况下,Foo总和为6。

我知道有NumPy的array_split,即pd.np.array_split(df, 2),但是这会将DataFrame拆分为具有相同行的部分。我怎么能这样做,但对于特定的列有相同的总和?

2 个答案:

答案 0 :(得分:0)

您可以使用cumsum,然后对该列进行过滤。例如:

>>> df['Foo_cumsum'] = df.Foo.cumsum()
>>> df
     Bar  Foo  Foo_cumsum
0  hello    1           1
1  world    2           3
2   spam    3           6
3   eggs    6          12

>>> df[(df.Foo_cumsum > 0) & (df.Foo_cumsum <= 6)]
     Bar  Foo  Foo_cumsum
0  hello    1           1
1  world    2           3
2   spam    3           6
>>> df[(df.Foo_cumsum > 6) & (df.Foo_cumsum <= 12)]
    Bar  Foo  Foo_cumsum
3  eggs    6          12

确保检查边界情况,例如过滤器是否为空DataFrame。

答案 1 :(得分:0)

通过@congusbongus改进解决方案

>>> import pandas as pd
>>> df = pd.DataFrame({'Foo': [1, 2, 3, 6], 'Bar': ['hello', 'world', 'spam', 'eggs']})
>>> df['Foo_cumsum'] = df.Foo.cumsum()
>>> import math
>>> no_buckets = 4
>>> bucket_size = df.Foo_cumsum.max() / no_buckets
>>> df['bucket'] = (df.Foo_cumsum / bucket_size).apply(math.ceil)
>>> df
     Bar  Foo  Foo_cumsum  bucket
0  hello    1           1       1
1  world    2           3       1
2   spam    3           6       2

在变量no_buckets

中更改相应所需的桶数