【问题标题】:Grouping index by specified group size in Pandas在 Pandas 中按指定的组大小对索引进行分组
【发布时间】:2018-08-22 23:07:15
【问题描述】:
我有一个如下所示的数据框:
df =
index value1 value2 value3
001 0.3 1.3 4.5
002 1.1 2.5 3.7
003 0.1 0.9 7.8
....
365 3.4 1.2 0.9
索引表示一年中的天数(所以有时索引的最后一个数字是 366),我想将它与随机天数(例如 10 天或 30 天)分组,我认为代码如下,
df_new = df.groupby( "method" ).mean()
在一些问题中,我看到他们使用 datetime 类型来分组,但是在我的数据框中,索引只是数字,有没有更好的分组方式?提前感谢!
【问题讨论】:
标签:
python
pandas
datetime
group-by
【解决方案1】:
我认为需要下限指数值和总平均数:
df_new = df.groupby( df.index // 10).mean()
如果不是默认唯一数字索引的另一种通用解决方案:
df_new = df.groupby( np.arange(len(df.index)) // 10).mean()
示例:
c = 'val1 val2 val3'.split()
df = pd.DataFrame(np.random.randint(10, size=(20,3)), columns=c)
print (df)
val1 val2 val3
0 5 9 4
1 5 7 1
2 8 3 5
3 2 4 2
4 2 8 4
5 8 5 6
6 0 9 8
7 2 3 6
8 7 0 0
9 3 3 5
10 6 6 3
11 8 9 6
12 5 1 6
13 1 5 9
14 1 4 5
15 3 2 2
16 4 5 4
17 3 5 1
18 9 4 5
19 9 8 7
df_new = df.groupby( df.index // 10).mean()
print (df_new)
val1 val2 val3
0 4.2 5.1 4.1
1 4.9 4.9 4.8
【解决方案2】:
只需通过底商运算符// 创建一个新索引并按此索引分组。这是一个有 155 行的示例。您可以删除结果的原始索引。
df = pd.DataFrame({'index': list(range(1, 156)),
'val1': np.random.rand(155),
'val2': np.random.rand(155),
'val3': np.random.rand(155)})
df['new_index'] = df['index'] // 10
res = df.groupby('new_index', as_index=False).mean().drop('index', 1)
# new_index val1 val2 val3
# 0 0 0.315851 0.462080 0.491779
# 1 1 0.377690 0.566162 0.588248
# 2 2 0.314571 0.471430 0.626292
# 3 3 0.725548 0.572577 0.530589
# 4 4 0.569597 0.466964 0.443815
# 5 5 0.470747 0.394189 0.321107
# 6 6 0.362968 0.362278 0.415093
# 7 7 0.403529 0.626155 0.322582
# 8 8 0.555819 0.415741 0.525251
# 9 9 0.454660 0.336846 0.524158
# 10 10 0.435777 0.495191 0.380897
# 11 11 0.345916 0.550897 0.487255
# 12 12 0.676762 0.464794 0.612018
# 13 13 0.524610 0.450550 0.472724
# 14 14 0.466074 0.542736 0.680481
# 15 15 0.456921 0.565800 0.442543