2016-12-02 2 views
1

У меня есть dataframe MULTINDEX и я пытаюсь заполнить вниз значение, MAX_PTS_YR, так что значение MAX_PTS_YR в t+1 год составляет MAX_PTS_YR в t.Панды | Fillna (ffill) в сгруппированной dataframe не заполнит

So: MAX_PTS_YR в 2016 должно быть равно 116.

Использование nth, я нашел MAX_PTS за предыдущий год:

DF['MAX_PTS_YR'] = DF.groupby(by=['Affiliation','Year'],as_index=False)['PtsYr'].nth(-1) 


Affiliation mkid  Year PtsYr MAX_PTS_YR 
MVPAFL0003 10176228 2015 96.0 NaN 
MVPAFL0003 10176228 2015 96.0 NaN 
MVPAFL0003 10176228 2015 106.0 NaN 
MVPAFL0003 10176228 2015 116.0 116.0 
MVPAFL0003 10176228 2016 10.0 NaN 
MVPAFL0003 10176228 2016 10.0 NaN 
MVPAFL0003 10176228 2016 20.0 NaN 
MVPAFL0003 10176228 2016 20.0 NaN 
MVPAFL0003 10176228 2016 30.0 NaN 
MVPAFL0003 10176228 2016 40.0 NaN 
MVPAFL0003 10176228 2016 50.0 NaN 
MVPAFL0003 10176228 2016 50.0 NaN 
MVPAFL0003 10176228 2016 52.0 NaN 
MVPAFL0003 10176228 2016 62.0 NaN 
MVPAFL0003 10176228 2016 62.0 NaN 
MVPAFL0003 10176228 2016 82.0 NaN 
MVPAFL0003 10176228 2016 94.0 NaN 
MVPAFL0003 10176228 2016 94.0 NaN 
MVPAFL0003 10176228 2016 94.0 NaN 
MVPAFL0003 10176228 2016 104.0 NaN 
MVPAFL0003 10176228 2016 114.0 114.0 

И я думал, что я мог бы fillna вниз на этой Affiliation группы:

DF.groupby(by=['Affiliation'],as_index=False)['MAX_PTS_AFFIL'].fillna(method='ffill',inplace=True) 

Но когда я это сделать, не NaN значения заполнены.

Любые идеи?

+0

Я думаю, что проблема связана с параметром 'inplace'. Вы работаете над копией, чтобы на самом деле изменить копию. Попробуйте 'DF ['MAX_PTS_AFFIL'] = DF.groupby (by = ['Affiliation'], as_index = False) ['MAX_PTS_AFFIL']. Fillna (method = 'ffill')' – ayhan

+0

Пробовал это, но не работает; Я получаю 'TypeError: несовместимый индекс вставленного столбца с индексом фрейма' – user791411

ответ

1
# get just the series you are filling to simplify things 
s1 = df.set_index(['Affiliation', 'Year']).MAX_PTS_YR 

# groupby to get the max per group 
mx = s1.groupby(level=[0, 1]).max() 

# shift your year index by one year 
mx.index.set_levels(mx.index.levels[1] + 1, 1, inplace=True) 

# fill in missing bits 
s1.fillna(mx) 

Affiliation Year 
MVPAFL0003 2015  NaN 
      2015  NaN 
      2015  NaN 
      2015 116.0 
      2016 116.0 
      2016 116.0 
      2016 116.0 
      2016 116.0 
      2016 116.0 
      2016 116.0 
      2016 116.0 
      2016 116.0 
      2016 116.0 
      2016 116.0 
      2016 116.0 
      2016 116.0 
      2016 116.0 
      2016 116.0 
      2016 116.0 
      2016 116.0 
      2016 114.0 
Name: MAX_PTS_YR, dtype: float64 

Теперь назначить ДФ

df.MAX_PTS_YR = (s1.fillna(mx).values) 
df 

enter image description here

+0

Большое вам спасибо! Только один последний вопрос: как установить последнее значение в конкретном году для согласования, учитывая приведенный выше пример? Итак, 'MAX_PTS_YR' в строке 20 будет равен' 116' вместо '114' и равен' NaN' в строке 2? – user791411

+0

@ user791411, что не соответствует тому, что вы просили. Вы должны включить заполненный блок данных, который представляет то, что вы хотите. – piRSquared

+0

мои извинения. Я хочу, чтобы все значения строк «MAX_PTS_YR» за данный год были равны максимальному значению «PtsYr» в предыдущем году, сгруппированным по «Affiliation» и «mkid». Поэтому я надеюсь, что есть способ установить последнее значение данного года, чтобы быть последовательным (так '' '' '' 'для каждого значения' MAX_PTS_YR' для '2016' для данного' Affiliation'). Я думал, что «fillNa» - это путь, но если есть лучший способ достичь моей цели. Итак, используя приведенное выше изображение, [см. Это изображение] (http://imgur.com/a/bbjJN) (извиняюсь, не думайте, что я могу поместить в DataFrame, который я хотел бы добавить в комментарий). – user791411

1

Если это единственный столбец с нулевыми данными, вы можете просто сделать операцию на весь фрейм данных:

DF.ffill(inplace=True) 

Обратите внимание, что вернет float, даже если вы первоначально ввели число точек в виде целых чисел. Это связано с тем, что NaN являются технически плавающими, и они вытесняют тип всей колонки. Для того, чтобы получить Интс (который, вероятно, что вы хотите, если вы не можете иметь частичные точки) это сделать:

DF['MAX_PTS_YR'].astype('int64', inplace=True) 

Может быть, вы хотели бы сделать это в колонке PTS тоже.

Смежные вопросы