这与以下内容类似,但我想再深入一个问题:pandas按多列分组应用并生成新列
我有这个数据框:
这些数字是正确的。然而,我需要输出一个系列,以便将其分配回原始数据帧,使其看起来像这样:
我该如何去做呢?使用apply是正确的方法吗?
Group Value Part Ratio
0 A 6373 10 0.637300
1 A 2512 10 0.251200
2 A 603 10 0.060300
3 A 512 10 0.051200
4 B 5200 20 0.472727
5 B 4800 20 0.436364
6 B 501 20 0.045545
7 B 499 20 0.045364
我希望你能帮忙翻译这个使用“比率”和“部分”列的函数,并将其应用于每个“组”的内容:
def allocation(df, ratio, part):
k = df[part].max()
frac, results = np.array(np.modf(k * df[ratio]))
remainder = int(k - results.sum())
indices = np.argsort(frac)[::-1]
results[indices[0:remainder]] += 1
return results.astype(int)
请注意,我的函数与我在上面提到的问题中提到的函数的不同之处在于,我的函数返回整个组的值数组而不是单个值。 我尝试了以下方法:
data.groupby('Group', group_keys=False).apply(allocation, ratio='Ratio', part='Part')
Out[67]:
Group
A [6, 2, 1, 1]
B [9, 9, 1, 1]
dtype: object
这些数字是正确的。然而,我需要输出一个系列,以便将其分配回原始数据帧,使其看起来像这样:
Group Value Part Ratio Allocate
0 A 6373 10 0.637300 6
1 A 2512 10 0.251200 2
2 A 603 10 0.060300 1
3 A 512 10 0.051200 1
4 B 5200 20 0.472727 9
5 B 4800 20 0.436364 9
6 B 501 20 0.045545 1
7 B 499 20 0.045364 1
我该如何去做呢?使用apply是正确的方法吗?
s
将按照分组键进行排序,而这可能与它们在原始框架df
中出现的顺序不同。要了解这一点,请尝试使用df2 = pd.concat([df[4:], df[:4]])
构建另一个框架,然后执行相同的操作。你会得到错误的答案。 - doraemon