【发布时间】:2017-12-15 05:14:18
【问题描述】:
假设我有一个表单的旋转数据框
Value Qty Code
Color Blue Green Red Blue Green Red Blue Green Red
Date
2017-07-01 0.0 1.1 0.0 0.0 12.0 0.0 0 abc 0
2017-07-03 2.3 1.3 0.0 3.0 1.0 0.0 cde abc 0
2017-07-06 0.0 0.0 1.4 0.0 0.0 1.0 0 0 cde
我有兴趣将日期重新采样为每周频率。我想对主列的每个子列执行以下转换,Value: max, Qty: sum, Code = last。在普通的非 MultiIndex 数据帧 df 中,可以通过 agg() 函数执行以下操作。
df.resample('W').agg({"Value":"max", "Qty":"sum", "Code":"last"})
但是当我尝试使用旋转数据框时,它不喜欢键。如果没有明确指定所有子列,在多索引数据帧的情况下我该怎么做?
预期的输出是
Value Qty Code
Color Blue Green Red Blue Green Red Blue Green Red
Date
2017-07-02 0.0 1.1 0.0 0.0 12.0 0.0 0 abc 0
2017-07-09 2.3 1.3 1.4 3.0 1.0 1.0 0 0 cde
要生成上述起始数据帧,请使用以下代码
from collections import OrderedDict
import pandas as pd
table = OrderedDict((
("Date", ["2017-07-01", "2017-07-03", "2017-07-03", "2017-07-6"]),
('Color',['Green', 'Blue', 'Green', 'Red']),
('Value', [1.1, 2.3, 1.3, 1.4]),
('Qty', [12, 3, 1, 1]),
('Code', ['abc', 'cde', 'abc', 'cde'])
))
d = pd.DataFrame(table)
p = d.pivot(index='Date', columns='Color')
p.index = pd.to_datetime(p.index)
p.fillna(0, inplace=True)
编辑:添加了所需的结果。
编辑 2:我还尝试创建一个字典来输入 agg() 函数,但它带有 4 级列标题。
dc = dict(zip(p.columns, map({'Value': 'max', 'Qty': 'sum', 'Code': 'last'}.get, [x[0] for x in p.columns])))
newp = p.resample('W').agg(dc)
【问题讨论】:
-
你的预期输出是什么?
标签: python pandas pivot aggregate resampling