Pandas映射多种条件

时间:2017-06-28 08:45:41

标签: python pandas dictionary

我的数据框由温度组成。现在,我需要创建季节性手段,例如 DJF (12月,1月,2月), MAM (3月,4月,5月), JJA (Jun,Jul,Aug), SON (9月,10月,11月)。

但是,我怎样才能考虑到DJF应该是去年12月,次年1月和2月的事实呢?

这是我到目前为止的代码:

z = {1: 'DJF', 2: 'DJF', 3: 'MAM', 4: 'MAM', 5: 'MAM', 6: 'JJA', 7: 'JJA', 8: 'JJA', 9: 'SON', 10: 'SON',
11: 'SON', 12: 'DJF'}
df['season'] = df['Mon'].map(z)

上述编码的问题在于,当我按年份和季节分组计算平均值时,DJF的值将不正确,因为它们需要同年的12月,1月和2月。

df.groupby(['Year','season']).mean()

1 个答案:

答案 0 :(得分:4)

我认为您可以按to_datetimeto_period

创建句点索引

然后shift一个飞蛾,然后按asfreq转换为Quarters

最后groupby索引anf聚合mean

df['Day'] = 1
df.index = pd.to_datetime(df[['Year','Month','Day']]).dt.to_period('M')
df = df.shift(1, freq='M').asfreq('Q')

print (df.groupby(level=0)['Temperature'].mean())

样品:

rng = pd.date_range('2017-04-03', periods=20, freq='M')
df = pd.DataFrame({'Date': rng, 'Temperature': range(20)})  
df['Year'] = df.Date.dt.year
df['Month'] = df.Date.dt.month
df = df.drop('Date', axis=1)
print (df)
    Temperature  Year  Month
0             0  2017      4
1             1  2017      5
2             2  2017      6
3             3  2017      7
4             4  2017      8
5             5  2017      9
6             6  2017     10
7             7  2017     11
8             8  2017     12
9             9  2018      1
10           10  2018      2
11           11  2018      3
12           12  2018      4
13           13  2018      5
14           14  2018      6
15           15  2018      7
16           16  2018      8
17           17  2018      9
18           18  2018     10
19           19  2018     11
df['Day'] = 1
df.index = pd.to_datetime(df[['Year','Month','Day']]).dt.to_period('M')
df = df.shift(1, freq='M').asfreq('Q')
print (df)
        Temperature  Year  Month  Day
2017Q2            0  2017      4    1
2017Q2            1  2017      5    1
2017Q3            2  2017      6    1
2017Q3            3  2017      7    1
2017Q3            4  2017      8    1
2017Q4            5  2017      9    1
2017Q4            6  2017     10    1
2017Q4            7  2017     11    1
2018Q1            8  2017     12    1
2018Q1            9  2018      1    1
2018Q1           10  2018      2    1
2018Q2           11  2018      3    1
2018Q2           12  2018      4    1
2018Q2           13  2018      5    1
2018Q3           14  2018      6    1
2018Q3           15  2018      7    1
2018Q3           16  2018      8    1
2018Q4           17  2018      9    1
2018Q4           18  2018     10    1
2018Q4           19  2018     11    1
print (df.groupby(level=0)['Temperature'].mean())
2017Q2     0.5
2017Q3     3.0
2017Q4     6.0
2018Q1     9.0
2018Q2    12.0
2018Q3    15.0
2018Q4    18.0
Freq: Q-DEC, Name: Temperature, dtype: float64

最后如果需要season列:

df1 = df.groupby(level=0)['Temperature'].mean().rename_axis('per').reset_index()
z = {1: 'DJF',2: 'MAM', 3: 'JJA', 4: 'SON'}
df1['season'] = df1['per'].dt.quarter.map(z)
df1['yaer'] = df1['per'].dt.year
print (df1)
     per  Temperature season  yaer
0 2017Q2          0.5    MAM  2017
1 2017Q3          3.0    JJA  2017
2 2017Q4          6.0    SON  2017
3 2018Q1          9.0    DJF  2018
4 2018Q2         12.0    MAM  2018
5 2018Q3         15.0    JJA  2018
6 2018Q4         18.0    SON  2018