2016-05-31 1 views
0

В последнее время я начал работать с пандами, и я пытаюсь сделать простую очистку данных. До сих пор я узнал, что при использовании панд существует много однострочных. Поэтому я также рассматриваю один в своем случае. У меня есть DataFrame как это:Pandas - замена значений NaN с использованием значений из других столбцов

C0   C1 C2   C3  C4 
    3789507  2010 NaN  NaN  NaN 
    3789508  NaN NaN  2010  NaN 
    3789509  NaN NaN  2016  NaN 
    3789510  NaN 2014  NaN  NaN 
    3789511  NaN NaN  NaN  2014 

Я хочу, чтобы в конечном итоге с чем-то вроде этого:

C0   C1 
3789507  2010 
3789508  2010 
3789509  2016 
3789510  2014 
3789511  2014 

Что я делаю сейчас просто:

k = df.C1.isnull() 
df.C1[k] = df.C2[k] 
k = df.C1.isnull() 
df.C1[k] = df.C3[k] 
k = df.C1.isnull() 
df.C1[k] = df.C4[k] 

Это работает, но это не самое приятное решение. Что, если у меня будет 100 столбцов? Является ли здесь единственным решением?

Только в случае, если мой цикл выглядит следующим образом:

for i in range(2,len(df.columns)): 
    k = df.C1.isnull() 
    df.C1[k] = df.ix[:,i] 

ответ

1

Панда имеет некоторые методы засыпки и forwardfill недостающих значений, так что вы можете сделать:

df['C1'] = df.bfill(axis='columns')['C1'] 

df 
Out[10]: 
     C0  C1  C2  C3  C4 
0 3789507 2010.0  NaN  NaN  NaN 
1 3789508 2010.0  NaN 2010.0  NaN 
2 3789509 2016.0  NaN 2016.0  NaN 
3 3789510 2014.0 2014.0  NaN  NaN 
4 3789511 2014.0  NaN  NaN 2014.0 

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

fill_cols = ['C1', 'C2', 'C3', 'C4'] 
df['C1'] = df[fill_cols].bfill(axis='columns')['C1'] 
+0

Один вопрос - если это не большая проблема, можете ли вы объяснить, как это работает? Должен ли я читать его со спины? Я имею в виду настоящий случай жизни с выбранными столбцами. – sebap123

+1

Итак, посмотрите на строку, где 'C4' имеет значение, но все остальные столбцы отсутствуют. 'df.bfill (axis = 'columns')' создает новый dataframe, где каждое пропущенное значение слева от 'C4' в этой строке получает значение из' C4'. Допустимое значение в 'C4'« заполнено »во все отсутствующие столбцы. Затем мы просто копируем заполненный столбец C1 в исходный фрейм данных. – Marius

+0

Большое спасибо - теперь я понял. – sebap123