Mam następującą ramkę danych:

    A    B   C   D
0  NaN  2.0 NaN  0
1  3.0  4.0 NaN  1
2  NaN  NaN NaN  5
3  NaN  3.0 NaN  4

Teraz chcę wypełnić wartości NULL z wartościami w B lub D. To jest, jeśli wartość jest null w b niż sprawdzić D. Więc wynikowy dataframe wygląda tak.

   A    B   C    D
0  2.0  2.0 NaN  0
1  3.0  4.0 NaN  1
2  5    NaN NaN  5
3  3.0  3.0 NaN  4

Mogę to zrobić za pomocą następującego kodu:

df['A'] = df['A'].fillna(df['B'])
df['A'] = df['A'].fillna(df['D'])

Ale chcę to zrobić w jednej linii, jak mogę to zrobić?

0
Muhammad Hassan 21 luty 2019, 13:27

2 odpowiedzi

Najlepsza odpowiedź

Możesz po prostu włączyć zarówno .fillna():

df['A'] = df.A.fillna(df.B).fillna(df.D)

    A    B   C   D
0  2.0  2.0 NaN  0
1  3.0  4.0 NaN  1
2  5.0  NaN NaN  5
3  3.0  3.0 NaN  4

Lub przy użyciu fillna za pomocą combine_first:

df['A'] = df.A.fillna(df.B.combine_first(df.D))
3
yatu 21 luty 2019, 10:35

Jeśli nie potrzebujesz łańcucha, ponieważ wiele kolumn jest lepiej używać brakujących wartości napełniania z wyborem pierwszej kolumny według pozycji:

df['A'] = df['A'].fillna(df[['B','D']].bfill(axis=1).iloc[:, 0])
print (df)
     A    B   C  D
0  2.0  2.0 NaN  0
1  3.0  4.0 NaN  1
2  5.0  NaN NaN  5
3  3.0  3.0 NaN  4
2
jezrael 21 luty 2019, 11:04