Python 将“平均值”复制到另一个数据帧
我是熊猫队的新手,我不完全了解pd.groupby是如何工作的 假设我有一个带有日期时间的数据框: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
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
sWM
byassign
并再次除法[[]]
Rename
columnPrice
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