Как найти режим из каждых n (50) строк в Python? - PullRequest
0 голосов
/ 09 мая 2018

У меня есть датафрейм с 8 столбцами и ~ 0,8 млн строк. Я хочу найти режим каждых 50 строк определенного столбца (например, столбца 5) в отдельном кадре данных. Мой подход выглядит следующим образом.

for i in range(1, len(data['Column5'])-1) :
  splitdata = (data['Column5'][i:(i+49)])  
  mode_pressure[j] = splitdata.mode()
  i = i+50
  j = j+1

Но я получаю сообщение об ошибке «объект int не поддерживает назначение элемента». Мой DF выглядит следующим образом

Col1 Col2   Col3     Col4        Col5   Col6    Col7 Col8
0   612458  6715209 671598606   101043  -56     224 16560   
1   612458  6715210 671598706   101038  -264    256 16696   
2   612458  6715211 671598806   101038  -144    192 16528   
3   612458  6715212 671598906   101043  -136    200 16576   
4   612458  6715213 671599006   101037  -232    104 16576   
5   612458  6715214 671599106   101038  -88     264 16904   
6   612458  6715215 671599206   101040  -200    176 16808
7   612458  6715212 671598906   101043  -136    200 16576   
8   612458  6715213 671599006   101037  -232    104 16576   
9   612458  6715214 671599106   101040  -88     264 16904   
10  612458  6715215 671599206   101040  -200    176 16808

Output: (assume mode of 5 values)
df_mode : 101038, 101048

Я написал ту же функцию в R. И R возвращает последнее (последнее) значение режима в качестве одного выхода для каждого набора 50.

i=1
j=1
while(i<=length(data$Column5)-1) {
  splitdata<-data$Column5[i:(i+49)]  
  mode_value[j] = modeest::mfv(splitdata)
  i=i+50
  j=j+1
}

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Я думаю, что другое решение (с rolling) может быть таким:

from scipy.stats import mode
df_mode = df['Col5'].rolling(window=50, min_periods=1).apply(lambda x: mode(x)[0])[::50]
0 голосов
/ 09 мая 2018

Я думаю, что нужно groupby от numpy arange для более общего решения, например хорошо работает с DatetimeIndex с разделением по полу:

df = df.groupby(np.arange(len(df)) // 50)['Col5'].apply(lambda x: x.mode())

Возможно несколько значений, поэтому возможны следующие решения: Multiindex:

df = df.groupby(np.arange(len(df)) // 5)['Col5'].apply(lambda x: x.mode())
print (df)
0  0    101038
   1    101043
1  0    101040
2  0    101040
Name: Col5, dtype: int64

Или списки:

df = df.groupby(np.arange(len(df)) // 5)['Col5'].apply(lambda x: x.mode().tolist())
print (df)
0    [101038, 101043]
1            [101040]
2            [101040]
Name: Col5, dtype: object
...