【问题标题】:python pandas calculate averages column by columnpython pandas逐列计算平均值
【发布时间】:2017-03-07 09:04:36
【问题描述】:

在熊猫 0.18.1、python 2.7.6 中:

假设我们有下表:

ID,FROM_YEAR,FROM_MONTH,YEARMONTH,AREA,AREA2
1,2015,1,201501,200,100
1,2015,2,201502,200,100
1,2015,3,201503,200,100
1,2015,4,201504,200,100
1,2015,5,201505,200,100
1,2015,6,201506,200,100
1,2015,7,201507,200,100
1,2015,8,201508,200,100
1,2015,9,201509,200,100
1,2015,10,201510,200,100
1,2015,11,201511,200,100
1,2015,12,201512,200,100
1,2016,1,201601,100,200
1,2016,2,201602,100,200
1,2016,3,201603,100,200
1,2016,4,201604,100,200
1,2016,5,201605,100,200
1,2016,6,201606,100,200
1,2016,7,201607,100,200
1,2016,8,201608,100,200
1,2016,9,201609,100,200
1,2016,10,201610,100,200
1,2016,11,201611,100,200
1,2016,12,201612,100,200

有什么方法可以在 python pandas 中执行与以下 MySQL 查询相同的操作(合并功能可能可以工作,但有什么方法可以避免在 python pandas 中进行昂贵的合并/连接)?

SELECT 
ID,
FROM_YEAR,
'A' AS TYPE,
AVG(AREA) AS AREA,
AVG(AREA2) AS AREA2
 FROM table GROUP BY ID,FROM_YEAR

UNION ALL 

SELECT 
ID,
FROM_YEAR,
'B' AS TYPE,
AVG(AREA) AS AREA,
AVG(AREA2) AS AREA2
 FROM table GROUP BY ID,FROM_YEAR;

这里的目标是按以下格式获取 AREA 和 AREA2 列的日历年平均值:

ID,FROM_YEAR,TYPE,AREA,AREA2
1,2015,A,200,100
1,2016,A,100,200
1,2015,B,200,100
1,2016,B,100,200

有哪位大师能开导吗?

================================== 一个扩展问题=========== ======

感谢您的回答!我刚刚在一个尾随的 12 案例中遇到了另一个问题:

期望的输出:

ID,FROM_YEAR,FROM_MONTH,YEARMONTH,AREA,AREA2
1,2015,1,201501,NULL,NULL
1,2015,2,201502,NULL,NULL
1,2015,3,201503,NULL,NULL
1,2015,4,201504,NULL,NULL
1,2015,5,201505,NULL,NULL
1,2015,6,201506,NULL,NULL
1,2015,7,201507,NULL,NULL
1,2015,8,201508,NULL,NULL
1,2015,9,201509,NULL,NULL
1,2015,10,201510,NULL,NULL
1,2015,11,201511,NULL,NULL
1,2015,12,201512,200,100

以下代码

agg=df.groupby(['ID','FROM_YEAR'])[['AREA','AREA2']].rolling(window=12).mean()

只会在缺少 FROM_MONTH 和 YEARMONTH 的情况下生成此结果。

ID,FROM_YEAR,AREA,AREA2
1,2015,NULL,NULL
1,2015,NULL,NULL
1,2015,NULL,NULL
1,2015,NULL,NULL
1,2015,NULL,NULL
1,2015,NULL,NULL
1,2015,NULL,NULL
1,2015,NULL,NULL
1,2015,NULL,NULL
1,2015,NULL,NULL
1,2015,NULL,NULL
1,2015,200,100

有人能解惑吗?谢谢!

【问题讨论】:

    标签: python python-2.7 pandas


    【解决方案1】:

    这里可以使用pandas.concat,它只涉及一个聚合,不调用merge/join进程:

    agg = df.groupby(['ID', 'FROM_YEAR'], as_index=False)[["AREA", "AREA2"]].mean()
    
    pd.concat([agg.assign(TYPE = t) for t in ["A", "B"]], ignore_index=True)
    

    【讨论】:

    • 很好地使用了assignconcat 的列表推导来在此处获取类型列! +1
    • @pansen 谢谢!欣赏评论。
    • 感谢 Psidom 的优雅回答!我有另一个关于如何添加另一列和更新问题的问题。你能开导吗?
    • 保留它们的一个选项是将这些列设置为索引。 df.set_index(['FROM_MONTH', 'YEARMONTH']).groupby(['ID','FROM_YEAR'])[['AREA','AREA2']].rolling(window=12).mean().reset_index()
    猜你喜欢
    • 1970-01-01
    • 2022-11-14
    • 2014-02-04
    • 1970-01-01
    • 2019-04-19
    • 2022-11-21
    • 1970-01-01
    • 2018-05-08
    • 2019-09-09
    相关资源
    最近更新 更多