У меня есть фрейм данных, как показано ниже:

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()

В некотором вопросе я видел, что они использовали тип даты и времени для группировки, однако в моем фрейме данных индекс - это просто числа, есть ли лучший способ сгруппировать его? заранее спасибо !

2
Chi 14 Мар 2018 в 15:07

2 ответа

Лучший ответ

Я думаю, что нужны значения индекса пола и совокупное среднее значение:

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
jezrael 14 Мар 2018 в 12:18

Просто создайте новый индекс с помощью оператора с плавающей точкой // и сгруппируйте по этому индексу. Вот пример с 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
1
jpp 14 Мар 2018 в 12:12