【问题标题】:Reshaping/Pivoting Data with Date Value使用日期值重塑/透视数据
【发布时间】:2018-10-16 23:48:42
【问题描述】:

我需要以 2 种方式旋转/重塑长格式数据: 1)添加日期列(End-of_month)并填写数值(总计) 2)添加日期列(End-of_month)并填写日期值(在上一个数据透视中达到“总”值的月份)

我可以做到 1:

data = pd.DataFrame({'date': ['1-12-2016', '1-23-2016', '2-23-2016', '2-1-2016', '3-4-2016'],
        'EOM': ['1-31-2016', '1-31-2016', '2-28-2016', '2-28-2016', '3-31-2016'],
        'country':['uk', 'usa', 'fr','fr','uk'],
        'tr_code': [10, 21, 20, 10,12],
        'TOTAL': [435, 367,891,1234,231]
        })

data['EOM'] = pd.to_datetime(data['EOM'])
data['date'] = pd.to_datetime(data['date'])


data_total = data.pivot_table(values='TOTAL', index=['country','tr_code'], columns='EOM')

Out[73]: 
EOM              2016-01-31  2016-02-28  2016-03-31
country tr_code                                    
fr      10              NaN      1234.0         NaN
        20              NaN       891.0         NaN
uk      10            435.0         NaN         NaN
        12              NaN         NaN       231.0
usa     21            367.0         NaN         NaN

但是,尝试使用“日期”更改值参数会产生: DataError:没有要聚合的数字类型

我基本上想要两个 df——一个是我完成的,另一个是相同格式的,但不是“TOTAL”值,而是完成该总数的“日期”。

非常感谢任何帮助。

【问题讨论】:

  • 您应该小心,pivot_table 的默认聚合函数是均值,因此当每个 bin 有多个测量值时,您将计算平均值,而不是总数。跨度>

标签: python-3.x pandas


【解决方案1】:

set_indexunstack

这假定['country', 'tr_code', 'EOM'] 的组合是唯一的,如果不是,则会中断。这就是聚合函数很重要的原因。当我们对一个组合进行多次观察时,我们需要一个规则。

data.set_index(['country', 'tr_code', 'EOM']).date.unstack()

EOM             2016-01-31 2016-02-28 2016-03-31
country tr_code                                 
fr      10             NaT 2016-02-01        NaT
        20             NaT 2016-02-23        NaT
uk      10      2016-01-12        NaT        NaT
        12             NaT        NaT 2016-03-04
usa     21      2016-01-23        NaT        NaT

aggfunc / pivot_table

默认聚合函数是mean,这对日期没有意义。 first 可以。也可以使用 ALollz 在他们删除的答案中使用的 last

data.pivot_table(
    values='date', index=['country', 'tr_code'], columns='EOM', aggfunc='first')

EOM             2016-01-31 2016-02-28 2016-03-31
country tr_code                                 
fr      10             NaT 2016-02-01        NaT
        20             NaT 2016-02-23        NaT
uk      10      2016-01-12        NaT        NaT
        12             NaT        NaT 2016-03-04
usa     21      2016-01-23        NaT        NaT

groupby

做与pivot_table相同的事情的方式不那么迷人

data.groupby(['country', 'tr_code', 'EOM']).date.first().unstack()

EOM             2016-01-31 2016-02-28 2016-03-31
country tr_code                                 
fr      10             NaT 2016-02-01        NaT
        20             NaT 2016-02-23        NaT
uk      10      2016-01-12        NaT        NaT
        12             NaT        NaT 2016-03-04
usa     21      2016-01-23        NaT        NaT

【讨论】:

    猜你喜欢
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多