【问题标题】:pandas pivot-table how to add nested columns熊猫数据透视表如何添加嵌套列
【发布时间】:2017-02-13 21:51:26
【问题描述】:

df

    billsec       disposition    Date           Hour
0   185            ANSWERED     2016-11-01       00
1   0             NO ANSWER     2016-11-01       00
2   41             ANSWERED     2016-11-01       01
3   4              ANSWERED     2016-12-02       05

有一个表格,我需要从中取出一个包含以下数据的汇总表:

行是一天中的小时数,列是天数,以天数为单位的呼叫总数/未接/总呼叫持续时间。

如何在此表中添加其他列(All、Lost、Time)。到目前为止,我只计算了每小时的总通话时间及其总数。不同表中的真相...

df.pivot_table(rows='Hour',cols='Date',aggfunc=len,fill_value=0)
df.pivot_table(rows='Hour',cols='Date',aggfunc=sum,fill_value=0)

【问题讨论】:

  • 欢迎来到 StackOverflow。请将您的数据集作为文本发布,以便人们可以复制和粘贴它们并使用它们来编码答案 - 当您使用图像时这是不可能的。请阅读how to make good reproducible pandas examples
  • @MaxU 已更正,希望是对的
  • 您能否解释一下您希望如何计算AllLostTime 列?
  • 我认为:All - 是一天中一小时的行数 Lost - disposition 列的“无答案”示例 Time - 总和列中当天小时的值
  • it 有帮助吗?

标签: python pandas pivot-table


【解决方案1】:

IIUC 你可以这样做:

假设我们有以下 DataFrame:

In [248]: df
Out[248]:
             calldate  billsec disposition
0 2016-11-01 00:05:26      185    ANSWERED
1 2016-11-01 00:01:26        0   NO ANSWER
2 2016-11-01 00:05:19       41    ANSWERED
3 2016-11-01 00:16:02        4    ANSWERED
4 2016-11-02 01:16:02       55    ANSWERED
5 2016-11-02 02:02:02        2   NO ANSWER

我们可以做到以下几点:

funcs = {
    'billsec': {
        'all':'size',
        'time':'sum'
    },
    'disposition': {
        'lost': lambda x: (x == 'NO ANSWER').sum()
    }
}

(df.assign(d=df.calldate.dt.strftime('%d.%m'), t=df.calldate.dt.hour)
   .groupby(['t','d'])[['billsec','disposition']].agg(funcs)
   .unstack('d', fill_value=0)
   .swaplevel(axis=1)
   .sort_index(level=[0,1], axis=1)
)

产量:

d 01.11           02.11
    all time lost   all time lost
t
0     4  230    1     0    0    0
1     0    0    0     1   55    0
2     0    0    0     1    2    1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 2021-02-28
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多