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
说明:
-
第一个多列
Sales
和 Price
到新列 W
和 assign
和 div
然后groupby
并按列名聚合mean
和sum
s
通过assign
创建列WM
并再次划分
按子集[[]]
仅选择必要的列
Rename
专栏Price
由unstack
重塑
swaplevel
MultiIndex
在列中
sort_index
- MultiIndex
的第一级
将MultiIndex
扁平化为map
和join
的列名
【讨论】:
@user3656916 - 给我一些时间解释。 @AntonZi - 如果我的回答有帮助,请不要忘记accept 它 - 单击答案旁边的复选标记,将其从灰色切换为已填充。谢谢。以上是关于Pandas groupby 对另一个数据框的意义的主要内容,如果未能解决你的问题,请参考以下文章
来自带有 NaN 的 pandas 数据框的 seaborn 热图
Pandas将groupby操作的结果保存为原始数据框中的新列[关闭]
一次在多列上使用 pandas groupby().apply(list) [重复]