按位置和日期/月份划分的 Python Pandas 平均值



使用: 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

最新更新