问题描述
我的数据框:
df:
order quantity
A 1
B 1
C 2
D 3
E 3
F 4
我的目标是根据“数量”值从此数据框创建一个组。 我想要的结果。
df:
group order quantity
1 A 1
B 1
C 2
2 D 3
E 1
3 E 2
F 2
4 F 2
所以在这里我想要的结果是基于数量的。
量的最大值为4。在group1
, group2
和group3
的合计值(A + B + C = 4)(即保持量的最大谷作为4)。
在group4
我们可以看到没有要添加的值,因此该组由剩余的部分组成(这里是2)。
在group2
和group3
您可以看到E和F的值被除。
因此,将来我可以按名称或编号选择组。
注意:我的实际订单(column["order"])
看起来像这样的"PMC11-AA1L1PAVWJJ+Z1"
它是一个字符串。
这可能在python中吗? 如果是的话,请给我建议方法。 我可以练习和学习。
1楼
您的数据:
df = pd.DataFrame({'order':['A', 'B', 'C', 'D', 'E', 'F'],'quantity':[1,1,2,3,3,4]})
解:
df = pd.DataFrame(np.concatenate(df.apply(lambda x: [x[0]] * x[1], 1).as_matrix()),
columns=['order'])
df['quantity'] = 1
df['group'] = sorted(range(0, len(df)/3, 1) * 4)[0:len(df)]
输出:
order quantity group
0 A 1 0
1 B 1 0
2 C 1 0
3 C 1 0
4 D 1 1
5 D 1 1
6 D 1 1
7 E 1 1
8 E 1 2
9 E 1 2
10 F 1 2
11 F 1 2
12 F 1 3
13 F 1 3
然后分组和求和。
df.groupby(['group', 'order']).sum()
输出:
quantity
group order
0 A 1
B 1
C 2
1 D 3
E 1
2 E 2
F 2
3 F 2
之后,您可以根据需要使用reset_index()。
希望对您有所帮助。
我应该解释一下解决方案吗? 对你起作用吗?
2楼
@ AnnaIliukovich-Strakovskaia解决方案很棒。 我用大熊猫重写了它。
#Generate input dataframe from @AnnaIliukovich-Strakovskaia
df = pd.DataFrame({'order':['A', 'B', 'C', 'D', 'E', 'F'],'quantity':[1,1,2,3,3,4]})
#Expand dataframe
df_out = df.order.repeat(df.quantity).reset_index(drop=True).to_frame()
#Create groupings of four records
df_out['grp'] = df_out.index // 4
#Groupby 'grp' and count
df_out.groupby(['grp','order'])['order'].count().to_frame(name='quantity')
输出:
quantity
grp order
0 A 1
B 1
C 2
1 D 3
E 1
2 E 2
F 2
3 F 2