Pandas groupby 对另一个数据框的意义

Posted

技术标签:

【中文标题】Pandas groupby 对另一个数据框的意义【英文标题】:Pandas groupby mean to another Dataframe 【发布时间】:2018-10-27 17:32:33 【问题描述】:

我是 Pandas 的新手,我并不完全了解 pd.groupby 的工作原理。

假设我有一个带有日期时间的数据框:

Date          City    Sales  Price
2018-01-01     NY      100     1
2018-01-01     NY      120     2
2018-01-01     NY       85     1.4
2018-01-01     LA       90     1.5
2018-01-01     SF       90     1
2018-01-01     SF       75     1

2018-01-02     NY      110     2
2018-01-02     NY      130     1.8
2018-01-02     NY      190     1.1
2018-01-02     LA      100     0.9
2018-01-02     LA      110     1.2
2018-01-02     LA      120     1.0
2018-01-02     LA       50     1.8
2018-01-02     SF      120     1.1

2018-01-03     NY       90     1.1
2018-01-03     LA       90     1.5
...
and so on

所以我有几个城市,每个城市都有几个不同价格的销售。 我需要一个新的数据框,其中包含每天的统计信息 价格(平均值 = SUMM(价格)/N)和 mean_weighted = SUMM(Price*Sales)/SUMM(Sales),或者作为一个选项: 每个城市和日期的正态分布参数)。

它看起来像

Date           NY_mean NY_mean_w LA_mean LA_mean_w SF_mean SF_mean_w 
2018-01-01     1.466      1.53      1.5     1.5       1       1
2018-01-02     1.633      1.54      1.03    and so on
2018-01-03     ...
2018-01-04     ...
2018-01-05     ...
...

有没有办法避免嵌套循环和子例程的类似 Fortran 的求和?我正在尝试(仅用于平均值):

import datetime
import pandas as pd
data = pd.read_pickle('path/data.pkl') # here is original data

index = pd.date_range(start = '2013-01-01', end = '2015-12-31', freq='D')

names = data.City.unique() # unique names
data_stat = pd.DataFrame(index=index, columns=columns)
data_stat = data_stat.fillna(0)

for nm in names: # iterate by name
    print(nm)
    data_stat.name = data [(data.City == nm)].groupby(Data).Price.mean()
data_stat.head()

但这给了我所有单元格中的 NaN。 对此的任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

用途:

df = (df.assign(W=df['Sales'].mul(df['Price']))
        .groupby(['Date','City']).agg('Price':'mean', 'W':'sum', 'Sales':'sum')
        .assign(WM = lambda x: x['PW'].div(x['Sales']))[['Price','WM']]
        .rename(columns='Price':'MEAN')
        .unstack()
        .swaplevel(0,1, axis=1)
        .sort_index(axis=1, level=0))

df.columns = df.columns.map('_'.join)
print (df)
            LA_MEAN     LA_WM   NY_MEAN     NY_WM  SF_MEAN  SF_WM
Date                                                             
2018-01-01    1.500  1.500000  1.466667  1.504918      1.0    1.0
2018-01-02    1.225  1.136842  1.633333  1.541860      1.1    1.1
2018-01-03    1.500  1.500000  1.100000  1.100000      NaN    NaN

说明

    第一个多列 SalesPrice 到新列 Wassigndiv 然后groupby 并按列名聚合meansums 通过assign创建列WM并再次划分 按子集[[]] 仅选择必要的列 Rename专栏Priceunstack重塑 swaplevel MultiIndex 在列中 sort_index - MultiIndex 的第一级 将MultiIndex 扁平化为mapjoin 的列名

【讨论】:

@user3656916 - 给我一些时间解释。 @AntonZi - 如果我的回答有帮助,请不要忘记accept 它 - 单击答案旁边的复选标记,将其从灰色切换为已填充。谢谢。

以上是关于Pandas groupby 对另一个数据框的意义的主要内容,如果未能解决你的问题,请参考以下文章

Pandas Groupby结果到一个单独的数据框中

来自带有 NaN 的 pandas 数据框的 seaborn 热图

Pandas将groupby操作的结果保存为原始数据框中的新列[关闭]

一次在多列上使用 pandas groupby().apply(list) [重复]

group的加权平均值不等于pandas groupby中的总平均值

对另一列python中的每个类别执行多个groupby