【问题标题】:Adding total row to a pandas DataFrame with tuples inside将总行添加到带有元组的 pandas DataFrame
【发布时间】: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


【解决方案1】:

用途:

#s=df.groupby(['Level', 'Company', 'Item'])['Value'].sum()

def GetTupleSum(x):
    return tuple(sum(y) for y in zip(*x.dropna()))

df= s.unstack('Item')
df['total']=df.apply(GetTupleSum,axis=1)
( df.unstack()
    .assign(total_company=df['total'].groupby(level=0).apply(GetTupleSum) )
    .stack(['Company','Item']) )

输出

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_company    (50, 100)
2      X        a                 (10, 20)
                b                 (10, 20)
                c                 (10, 20)
                total             (30, 60)
       Y        a                 (10, 20)
                total             (10, 20)
                total_company     (40, 80)
dtype: object

【讨论】:

  • 感谢您的回答。公司列的总行数呢?
  • 请立即检查:) 如果可行,请考虑接受或投票
  • 这适用于您展示的示例,您能否提供更多详细信息?
猜你喜欢
  • 1970-01-01
  • 2022-11-10
  • 1970-01-01
  • 2013-01-19
  • 2014-05-19
  • 1970-01-01
  • 2016-04-19
  • 2020-03-04
  • 2016-02-04
相关资源
最近更新 更多