Python 将“平均值”复制到另一个数据帧

Python 将“平均值”复制到另一个数据帧,python,pandas,group-by,mean,Python,Pandas,Group By,Mean,我是熊猫队的新手,我不完全了解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

我是熊猫队的新手,我不完全了解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
所以我有几个城市,每个城市都有不同价格的销售。 我需要一个新的数据框,它将包含每天的统计数据 价格(平均值=总和(价格)/N)和 加权平均值=总和(价格*销售额)/总和(销售额),或作为选项: 每个城市和日期的正态分布参数)

所以看起来像

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的求和?我正在尝试(仅针对平均值):

但这给了我所有细胞中的NaN。 在此方面的任何帮助都将不胜感激。

请使用:

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
说明

  • 第一个多列
    Sales
    Price
    到新列
    W
  • 然后,按列名称聚合
    mean
    sum
    s
  • 创建列
    WM
    by
    assign
    并再次除法
  • 仅按子集选择必要的列
    [[]]
  • Rename
    column
    Price
  • 重塑
  • swaplevel
    列中的多索引
  • -多索引的第一级
  • 通过
    map
    join

  • @user3656916-给我一些时间解释。@AntonZi-如果我的答案有用,别忘了-单击答案旁边的复选标记,将其从灰色变为填充。谢谢
    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