In [124]: df = pd.DataFrame({'key1':['a', 'a', 'b', 'b', 'a'],^M
...: ... 'key2':['one', 'two', 'one', 'two', 'one'],^M
...: ... 'data1':[1,2,3,4,5],^M
...: ... 'data2':[6,7,8,9,10]})
In [125]: df
Out[125]:
data1 data2 key1 key2
0 1 6 a one
1 2 7 a two
2 3 8 b one
3 4 9 b two
4 5 10 a one
#-------------------------------------------------------------
In [126]: grouped=df['data1'].groupby(df['key1'])
In [127]: grouped
Out[127]: <pandas.core.groupby.SeriesGroupBy object at 0x000001589EE04C88>
#变量grouped是一个GroupBy对象,它实际上还没有进行任何计算,只是含有一些有关分组键df['key1']的中间数据而已,
#然后我们可以调用GroupBy的mean(),sum(),size(),count()等方法,索引为key1列中的唯一值
In [128]: grouped.sum()
Out[128]:
a 8
b 7
Name: data1, dtype: int64
In [129]: grouped.count()
Out[129]:
a 3
b 2
Name: data1, dtype: int64
In [130]: grouped.size()
Out[130]:
a 3
b 2
dtype: int64
In [131]: grouped.mean()
Out[131]:
a 2.666667
b 3.500000
Name: data1, dtype: float64
#-------------------------------------------------------------
#一次传入多个数组,就会得到不同的结果:
In [132]: df['data1'].groupby([df['key1'], df['key2']]).mean()
Out[132]:
key1 key2
a one 3
two 2
b one 3
two 4
Name: data1, dtype: int64
#unstack()
In [133]: df['data1'].groupby([df['key1'], df['key2']]).mean().unstack()
Out[133]:
key2 one two
a 3 2
b 3 4
In [134]: df.groupby('key1').mean()
Out[134]:
data1 data2
a 2.666667 7.666667
b 3.500000 8.500000
#在执行df.groupby('key1').mean()时,结果中没有key2列。这是因为df['key2']不是数值数据,
#所以被从结果中排除了。默认情况下,所有数值列都会被聚合,虽然有时可能会被过滤为一个子集。
#-------------------------------------------------------------
#size()和count()的区别
In [144]: df2
Out[144]:
data1 data2 key1 key2 data3
0 1 6 a one 1.0
1 2 7 a two 2.0
2 3 8 b one 3.0
3 4 9 b two 4.0
4 5 10 a one NaN
In [145]: df2.groupby(['key1', 'key2']).count()
Out[145]:
data1 data2 data3
key1 key2
a one 2 2 1
two 1 1 1
b one 1 1 1
two 1 1 1
In [146]: df2.groupby(['key1', 'key2']).size()
Out[146]:
key1 key2
a one 2
two 1
b one 1
two 1
dtype: int64
pandas的时期(period)
pd.Period 类的构造函数仍需要一个时间戳,以及一个 freq 参数。freq 用于指明该 period 的长度,时间戳则说明该 period 在公元时间轴上的位置。
In [108]: p=pd.Period(2010,freq='M')
In [109]: p
Out[109]: Period('2010-01', 'M')
In [110]: pd.period_range('2010-01','2010-05',freq='M')
Out[110]: PeriodIndex(['2010-01', '2010-02', '2010-03', '2010-04', '2010-05'], dtype='period[M]', freq='M')
时间戳与时期间相互转换
In [113]: ts = pd.Series(np.random.randn(4),index=pd.period_range('201001','201004',freq='M'))
In [114]: ts
Out[114]:
2010-01 -0.617026
2010-02 -2.939740
2010-03 0.695834
2010-04 -1.461667
Freq: M, dtype: float64
In [115]: ts.to_timestamp()
Out[115]:
2010-01-01 -0.617026
2010-02-01 -2.939740
2010-03-01 0.695834
2010-04-01 -1.461667
Freq: MS, dtype: float64
In [116]: ts.to_timestamp(how='end')
Out[116]:
2010-01-31 -0.617026
2010-02-28 -2.939740
2010-03-31 0.695834
2010-04-30 -1.461667
Freq: M, dtype: float64
In [117]: ts.to_timestamp().to_period()
Out[117]:
2010-01 -0.617026
2010-02 -2.939740
2010-03 0.695834
2010-04 -1.461667
Freq: M, dtype: float64
In [118]: ts.to_timestamp().to_period('D')
Out[118]:
2010-01-01 -0.617026
2010-02-01 -2.939740
2010-03-01 0.695834
2010-04-01 -1.461667
Freq: D, dtype: float64