我有一个像这样的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拆分为具有相同行的部分。我怎么能这样做,但对于特定的列有相同的总和?
答案 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