Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将一个数据帧按一定值之和拆分为多个数据帧?_Python_Pandas_Dataframe - Fatal编程技术网

Python 如何将一个数据帧按一定值之和拆分为多个数据帧?

Python 如何将一个数据帧按一定值之和拆分为多个数据帧?,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个看起来像这样的数据框: Name Count 0 John 0.25 1 Adam 0.75 2 Michael 1.5 3 Jane 0.8 4 Anna 2.0 5 Sarah 0.25 我的目标是根据限制值将此数据帧拆分为多个数据帧。 对于本例,极限值为3-因此结果如下所示: Name Count 0 John 0.25 1 Adam 0.

我有一个看起来像这样的数据框:

    Name      Count
0   John      0.25
1   Adam      0.75
2   Michael   1.5
3   Jane      0.8
4   Anna      2.0
5   Sarah     0.25

我的目标是根据限制值将此数据帧拆分为多个数据帧。 对于本例,极限值为3-因此结果如下所示:

    Name      Count
0   John      0.25
1   Adam      0.75
2   Michael   1.5


   Name      Count
0  Jane      0.8
1  Anna      2.0

   Name      Count
0  Sarah     0.25
关键是,在每个新数据帧中,计数总和接近极限值,但不超过极限值(即Jane在第二个数据帧中,因为如果她包括在第一个数据帧中,总和将为3.3,超过极限值3)

我相信这在.iterrows中是可能的,但这相当沉重/缓慢,因此正在寻找另一种解决方案。

我们可以这样做

LIMIT = 3
assert df['Count'].le(LIMIT).all()

groups = []
sum = 0
group = 0

for val in df['Count']:
    sum += val
    if sum > LIMIT:
        group += 1
        sum = val
    groups.append(group)
    
my_dict = {f'Group {i}' : group.reset_index(drop=True) 
           for i, group in df.groupby(groups)}
#print(my_dict['Group 0'])
我们可以

LIMIT = 3
assert df['Count'].le(LIMIT).all()

groups = []
sum = 0
group = 0

for val in df['Count']:
    sum += val
    if sum > LIMIT:
        group += 1
        sum = val
    groups.append(group)
    
my_dict = {f'Group {i}' : group.reset_index(drop=True) 
           for i, group in df.groupby(groups)}
#print(my_dict['Group 0'])
为了加快速度,我们可以使用即时编译()并将非常有效:

从我的另一个功能调整

来自numba import njit
将numpy作为np导入
@njit
def cumsum_重置(阵列、限制):
总数=0
计数器=0
groups=np.empty(array.shape[0])
对于idx,枚举中的i(数组):
总数+=i
如果总数>=限额:
总数=0
总数+=i
计数器+=1
组[idx]=计数器
其他:
组[idx]=计数器
返回组
groups=cumsum_reset(df['Count'].to_numpy(),3)
对于df.groupby(组)中的grp:
印刷品(玻璃钢)
姓名计数
约翰0.25
1.0.75
2迈克尔1.50
姓名计数
3.0.8
4.2.0
姓名计数
5.0.25
为了提高速度,我们可以使用即时编译()并将非常有效:

从我的另一个功能调整

来自numba import njit
将numpy作为np导入
@njit
def cumsum_重置(阵列、限制):
总数=0
计数器=0
groups=np.empty(array.shape[0])
对于idx,枚举中的i(数组):
总数+=i
如果总数>=限额:
总数=0
总数+=i
计数器+=1
组[idx]=计数器
其他:
组[idx]=计数器
返回组
groups=cumsum_reset(df['Count'].to_numpy(),3)
对于df.groupby(组)中的grp:
印刷品(玻璃钢)
姓名计数
约翰0.25
1.0.75
2迈克尔1.50
姓名计数
3.0.8
4.2.0
姓名计数
5.0.25

你可以发布一个可复制的示例,以便更容易使用吗?你可以使用
pd.read_clipboard()
@UGuntupalli你可以发布一个可复制的示例,以便更容易使用吗?你可以使用
pd.read_clipboard()
@UGuntupalli