gpt4 book ai didi

python - Pandas 使用 agg() 函数旋转数据框

转载 作者:行者123 更新时间:2023-12-01 02:48:40 25 4
gpt4 key购买 nike

假设我有一个以下形式的旋转数据框

           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

我有兴趣将日期重新采样为每周频率。我想对主列的每个子列执行以下转换,值:max,数量:总和,代码=最后。在普通的非 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)

最佳答案

首先考虑组合分层列并按不同列类型运行每周聚合:数量代码

# COMBINE THE LIST OF MULTI-LEVEL COLUMN (LIST OF TUPLES)
p.columns = [i[0]+i[1] for i in p.columns]
p.columns = p.columns.get_level_values(0)

# HORIZONTAL MERGE
out = pd.concat([p.resample('W').max()[[c for c in p.columns if 'Value' in c]],
p.resample('W').sum()[[c for c in p.columns if 'Qty' in c]],
p.resample('W').last()[[c for c in p.columns if 'Code' in c]]], axis=1)
print(out)
# ValueBlue ValueGreen ValueRed QtyBlue QtyGreen QtyRed CodeBlue CodeGreen CodeRed
# 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

要保留原始分层列,请在展平列级别之前保存列对象,然后在重采样过程后重新分配回列:

pvtcolumns = p.columns

# ...same code as above

out.columns = pvtcolumns
print(df)

# 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

关于python - Pandas 使用 agg() 函数旋转数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45029500/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com