【问题标题】:Pandas groupby mean to another DataframePandas groupby 对另一个数据框的意义
【发布时间】: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。 对此的任何帮助将不胜感激。

【问题讨论】:

    标签: python pandas group-by mean


    【解决方案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
    

    说明

    1. 第一个多列 SalesPrice 到新列 Wassigndiv
    2. 然后groupby 并按列名聚合meansums
    3. 通过assign创建列WM并再次划分
    4. 按子集[[]] 仅选择必要的列
    5. Rename专栏Price
    6. unstack重塑
    7. swaplevel MultiIndex 在列中
    8. sort_index - MultiIndex 的第一级
    9. MultiIndex 扁平化为mapjoin 的列名

    【讨论】:

    • @user3656916 - 给我一些时间解释。
    • @AntonZi - 如果我的回答有帮助,请不要忘记accept 它 - 单击答案旁边的复选标记,将其从灰色切换为已填充。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-10
    • 1970-01-01
    • 2017-07-19
    • 2017-01-01
    相关资源
    最近更新 更多