2016-03-23 3 views
-1

Учитывая следующий кадр данных:Панды Наполните NaN с значениями столбца

import pandas as pd 
import numpy as np 
df = pd.DataFrame({'A':[1,1,np.nan], 
        'B':[2.2,np.nan,2.2]})   
df 

    A  B 
0 1.0  2.2 
1 1.0  NaN 
2 NaN  2.2 

Если я хочу, чтобы заменить значение NaN в столбце А со значением, который повторяется в этой колонке (1) и сделать то же самое для столбца B, какой тип fillna() мне нужно использовать?

A  B 
0 1.0  2.2 
1 1.0  NaN 
2 NaN  2.2 

Ищете универсальное решение, поскольку у меня действительно есть тысячи строк. Спасибо заранее!

ответ

2

Почему не просто:

df.fillna(method='ffill') 

# df = pd.DataFrame({'A': [1, 1, np.nan, 2], 'B': [2.2, np.nan, 2.2, 1.9]}) 
# df.fillna(method='ffill') 
# A B 
#0 1 2.2 
#1 1 2.2 
#2 1 2.2 
#3 2 1.9 
+0

Непонятно из OP, если значение заполнения должно быть только предыдущим или самым общим значением в столбце. –

+0

hum я понял это как предыдущее значение, но вы можете быть правы. –

+0

Из моего примера это простой ответ, который я искал. Однако, что, если бы я хотел заполнить наиболее распространенную ценность? В конечном итоге я пытаюсь заполнить пробелы в результате процедуры df.loc и groupby-transform, которая оставляет некоторые значения строк пустым. –

2

fillna может принимать словарь значений, где ключ является именем столбца.

Предполагая, что вы хотите, чтобы заполнить столбцы со значением, который повторяется больше всего, вы можете вычислить словарь с:

df = pd.DataFrame({ 
    'A': [1, 1, np.nan, 2], 
    'B': [2.2, np.nan, 2.2, 1.9] 
}) 
fill_dict = df.mode().to_dict(orient='records')[0] 
df = df.fillna(values=fill_dict) 
df 

    A B 
0 1 2.2 
1 1 2.2 
2 1 2.2 
3 2 1.9 
0
import itertools 
import operator 

def most_common(L): 
    # get an iterable of (item, iterable) pairs 
    SL = sorted((x, i) for i, x in enumerate(L)) 
    # print 'SL:', SL 
    groups = itertools.groupby(SL, key=operator.itemgetter(0)) 
    # auxiliary function to get "quality" for an item 
    def _auxfun(g): 
    item, iterable = g 
    count = 0 
    min_index = len(L) 
    for _, where in iterable: 
     count += 1 
     min_index = min(min_index, where) 
    # print 'item %r, count %r, minind %r' % (item, count, min_index) 
    return count, -min_index 
    # pick the highest-count/earliest item 
    return max(groups, key=_auxfun)[0] 

, а затем просто добавить

df['A'].fillna(most_common(df['A'].values.tolist())) 
+0

Я впечатлен ваша реализация 'mode' с itertools. Но даже если мы забудем на мгновение, что в кадре данных pandas есть свой метод 'mode', использование функции режима numpy, безусловно, будет намного более надежным. –

+0

Я согласен ... я просто забыл о режиме, поэтому я сделал это ... Не знаю, правильно ли это или нет !!!! –

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