使用: Python 3.6, Pandas 0.22
我有一个.csv文件,我需要根据月份和位置从中获取平均值。这是数据中的一行,还有更多具有多个位置和日期的行:
NAME DATE SNOW
GRAND RAPIDS GERALD R FORD INTERNATIONAL AIRPORT, MI US 1/1/2016, 0.7
到目前为止,我已经成功地根据月份和每月平均值对信息进行了排序:
df2 = pd.read_csv("Data.csv")
gname = df2.groupby('NAME')
for NAME, NAME_df2 in gname:
df2['DATE'] = pd.to_datetime(df2['DATE'])
df2.groupby(df2['DATE'].dt.strftime('%B'))['SNOW'].mean().sort_values()
执行时:
DATE
August 0.000000
July 0.000000
June 0.000000
September 0.000000
May 0.000562
October 0.000966
November 0.019712
April 0.155592
March 0.248475
February 0.319048
January 0.622969
December 1.129986
Name: SNOW, dtype: float64
我的问题是,此代码只是在无限循环中给出所有位置每个月的总平均值。我无法弄清楚如何让我的输出根据每个位置每月的平均降雪量对数据进行排序。
在循环访问数据帧时对其进行修改。这是错误的。
您需要按月份和地点分组:
df2.groupby([df.DATE.dt.month,'NAME']).mean()
您将获得一个具有两级多索引的数据帧。稍后可以通过unstack()
ing 将其转换为表。
计算df
数字列的平均值,称为df['Sentiment']
,每月和列中指定的每个位置'Place'
:
0. 导入datetime
模块:
from datetime import datetime
1. 数据框
生成包含列'date'
、'Sentiment'
'Place'
的数据帧:
date_rng = pd.date_range(start='1/1/2018', end='3/05/2018', freq='W')
df = pd.DataFrame(date_rng, columns=['date'])
df['Sentiment']=np.random.randint(0,100,size=(len(date_rng)))
df['Place']=['home']*3 + ['With friends']*3 + ['School']*3
print(df)
date Sentiment Place
0 2018-01-07 62 home
1 2018-01-14 55 home
2 2018-01-21 84 home
3 2018-01-28 65 With_friends
4 2018-02-04 3 With_friends
5 2018-02-11 26 With_friends
6 2018-02-18 9 School
7 2018-02-25 52 School
8 2018-03-04 74 School
2. 将'date'
列转换为df
的索引: 然后检索索引的月份列表:
df.set_index('date',inplace=True)
months=df.index.month
Sentiment Place
date
2018-01-07 64 home
2018-01-14 41 home
2018-01-21 97 home
2018-01-28 44 With_friends
2018-02-04 37 With_friends
2018-02-11 69 With_friends
2018-02-18 15 School
2018-02-25 42 School
2018-03-04 4 School
3. 按组计算平均值:月和'Place'
:
monthly_val=df.groupby([months,'Place']).mean()
Sentiment
date Place
1 With_friends 44.000000
home 67.333333
2 School 28.500000
With_friends 53.000000
3 School 4.000000
4. 解栈()
如上所述@DYZ建议的,您可以取消堆叠monthly_val以获得信息丰富的交叉表:
monthly_val.unstack()
Sentiment
Place School With_friends home
date
1 NaN 65.0 67.0
2 30.5 14.5 NaN
3 74.0 NaN NaN