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