【发布时间】:2019-12-16 21:06:20
【问题描述】:
这是我的previous question(已回答)。它帮助我解决了我最初的问题,但现在我被困在另一个问题上。
我在pandas.DataFrame 下面有这个,我尝试为每个子级别添加总行数。
Level Company Item
1 X a (10, 20)
b (10, 20)
Y a (10, 20)
b (10, 20)
c (10, 20)
2 X a (10, 20)
b (10, 20)
c (10, 20)
Y a (10, 20)
我想要这个:
Level Company Item
1 X a (10, 20)
b (10, 20)
total (20, 40)
Y a (10, 20)
b (10, 20)
c (10, 20)
total (30, 60)
total (50, 100)
total (50, 100)
2 X a (10, 20)
b (10, 20)
c (10, 20)
total (30, 60)
Y a (10, 20)
total (10, 20)
total (40, 80)
total (40, 80)
获取数据框:
level = list(map(int, list('111112222')))
company = list('XXYYYXXXY')
item = list('ababcabca')
value = [(10,20)]*9
col = ['Level', 'Company', 'Item', 'Value']
df = pd.DataFrame([level,company,item,value]).T
df.columns = col
df.groupby(['Level', 'Company', 'Item'])['Value'].sum()
但我的结果是:
Level Company Item
1 X a (10, 20)
b (10, 20)
Y a (10, 20)
b (10, 20)
c (10, 20)
total (50, 100)
2 X a (10, 20)
b (10, 20)
c (10, 20)
Y a (10, 20)
total (40, 80)
使用以下脚本:
def f(x):
return tuple(sum(x) for x in zip(*filter(lambda x: type(x) == tuple, x)))
m=df.unstack(level=['Company','Item'])
m=m.assign(total=m.apply(f, axis=1))
m=m.stack(level='Company')
m=m.assign(total=m.apply(f))
m=m.stack(level='Item')
m
【问题讨论】:
-
每个元组是否总是有 2 个元素?
-
@AndyL。不,在实际情况下,它们有 N 个元素,所以我宁愿有一个通用的解决方案。
-
这样下单的目的是什么?演示?
-
如果 1 行有 2 个元素的元组,另一行有 3 个元素,例如:
(5, 10)和(7, 15, 3),您对这种情况的预期输出是什么? -
@Datanovice 例如,当我们在 Excel 表中过滤数据时,能够获取每个子级别的总数
标签: python-3.x pandas group-by pivot-table