Могут ли pandas выбрать некоторые данные или все столбцы, относящиеся к данным, и усреднить каждые 5 строк, используя pandas с python 2.7?

Я хотел бы рассчитывать среднее или стандартное значение каждые 5 строк в определенном столбце и выбрать данные (первые или последние, все или некоторые данные, которые я выберу) из другого столбца, используя pandas с python 2.7

Это мой фрейм данных (пример):

>>df
       DateTime     Product     Location       Value       Place
0    12-07-2018           A           S1       1.313       601
1    12-07-2018           B           S1       3.089       601/14
2    12-07-2018           C           S1       1.890       601
3    12-07-2018           D           S1       3.136       601
4**  12-07-2018           E           S1       3.258       601/15
5    13-07-2018           F           S1       3.113       601
6    13-07-2018           G           S1       2.651       601/12
7    13-07-2018           H           S1       2.135       601
8    13-07-2018           I           S1       1.555       602
9**  14-07-2018           J           S1       2.009       602
10   14-07-2018           K           S1       1.757       602
11   14-07-2018           L           S1       1.808       602/11
12   14-07-2018           M           S1       1.511       603/10
13   15-07-2018           N           S1       2.265       603
14** 15-07-2018           O           S1       2.356       603
15   15-07-2018           P           S1       2.950       603/09
16   15-07-2018           Q           S1       3.300       603/09

Теперь я могу усреднять значение каждые 5 строк и выбирать данные из столбца DateTime, Place (первый или последний) с помощью этого кода (пример. средний и выберите последний):

new_df = df[:(len(df)//5)*5].groupby(df[:(len(df)//5)*5].index // 5).agg({'DateTime':'last', 'Value':'mean', 'Place':'last'})

Это результат среднего значения каждые 5 строк и выбор последних данных (пример. средний и выберите последний):

>> new_df
     DateTime       Value     Place
0  12-07-2018      2.5372     601/15
1  14-07-2018      2.2926     602
2  15-07-2018      1.9394     603

Если я хочу, чтобы результат был таким же (средний, выберите последний и все):

>> new_df
     DateTime   Product      Value      Place
0  12-07-2018   A,B,C,D,E    2.5372     601, 601/14, 601, 601, 601/15
1  14-07-2018   F,G,H,I,J    2.2926     601, 601/12, 601, 602, 602 
2  15-07-2018   K,L,M,N,O    1.9394     602, 602, 602/11, 603/10, 603

и (среднее, выберите некоторые данные)

>> new_df
     DateTime   Product      Value      Place
0  12-07-2018   A,C,E        2.5372     601, 601/14, 601
1  14-07-2018   F,G          2.2926     601, 601/12
2  15-07-2018   L,M,N,O      1.9394     602/11

Могут ли панды это делать ???

Примечание: я добавляю ** для удобства наблюдения через каждые 5 рядов.

Если выбрать только несколько значений, среднее значение не изменится?

jezrael 10.09.2018 10:38
1
1
70
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Используйте .join в сводном словаре:

d = {'DateTime':'last', 'Value':'mean', 'Place':', '.join, 'Product':', '.join}
new_df = df[:(len(df)//5)*5].groupby(df[:(len(df)//5)*5].index // 5).agg(d)
print (new_df)
    DateTime   Value                          Place        Product
0 2018-12-07  2.5372  601, 601/14, 601, 601, 601/15  A, B, C, D, E
1 2018-07-14  2.2926     601, 601/12, 601, 602, 602  F, G, H, I, J
2 2018-07-15  1.9394  602, 602/11, 603/10, 603, 603  K, L, M, N, O

Но если нужна фильтрация в совокупной функции:

def f(x):
    a = x['DateTime'].iloc[-1]
    b = x['Value'].mean()

    x = x[x['Product'].isin(['A','C','E','F','G','L','M','N', 'O'])]
    c = ', '.join(x['Place'])
    d = ', '.join(x['Product'])
    return pd.Series([a,b,c,d], index=['DateTime','Value','Place','Product'])

new_df = df[:(len(df)//5)*5].groupby(df[:(len(df)//5)*5].index // 5).apply(f)
print (new_df)
    DateTime   Value                     Place     Product
0 2018-12-07  2.5372          601, 601, 601/15     A, C, E
1 2018-07-14  2.2926               601, 601/12        F, G
2 2018-07-15  1.9394  602/11, 603/10, 603, 603  L, M, N, O

@ jezrael Большое спасибо за вашу помощь. Ты всегда помогал мне, когда у меня были проблемы. Я действительно ценю это.

kanpisek sasuk 11.09.2018 03:40

Если во фрейме данных много строк (около 100 200 ++), он не может использовать .agg (d). Почему так случилось?

kanpisek sasuk 21.09.2018 10:59

@kanpiseksasuk - Почему нельзя использовать? Это вызывает ошибку?

jezrael 21.09.2018 11:00

@kanpiseksasuk - Что за ошибка? Колонка F представляет собой колонку Product?

jezrael 25.09.2018 08:20

Столбец @ jezrael F - столбец Место. Теперь нет проблем. Я не знаю, почему ошибка не возникает, но в прошлом предупреждение о проблеме о том, что переменная должна быть агрегированной, не создается. Я решил решить проблему в то время, чтобы выбрать последний столбец Место --- >> «Место»: «последний», тогда проблема исчезла.

kanpisek sasuk 25.09.2018 10:03

enter image description here

Причина ошибки может быть в том, что информация в моем столбце «Место» такая.

Другие вопросы по теме