come utilizzare i valori in altre colonne per riempire nan di una colonna in Panda

2020-02-22 python pandas dataframe

Ho bisogno di riempire il valore nan con valori in altre colonne, per esempio Ho un df come questo:

col1, col2, col3, col4
1     nan    nan   nan
2     3      nan   nan
4     nan    5     nan
6     8      nan   9 

Ho bisogno di trasformare il df sopra in

col1, col2, col3, col4
1     nan    nan     1
2       3    nan     2
4     nan      5     4
6     8      nan     9 

Voglio col1 attraverso col1 ~ col3 e ottenere il primo valore disponibile per quella riga e usare il valore per sostituire il nan in col4 , tuttavia se la riga in col4 già valore, ignora quella riga.

Sono stato informato che il looping su dataframe non è l'ideale, quali altre opzioni ho?

Answers

Provare:

df.assign(col4 = df.apply(lambda row: row[row.first_valid_index()], axis=1))

Produzione:

   col1,col2,col3,col4
0   1.0 NaN NaN 1.0
1   NaN 3.0 NaN 3.0
2   4.0 NaN 5.0 4.0
3   6.0 8.0 NaN 6.0

df.assign(col4 = df.apply(lambda row: row.first_valid_index(), axis=1))

Questo ti darà:

   col1,col2,col3,col4
0   1.0 NaN NaN col1,
1   NaN 3.0 NaN col2,
2   4.0 NaN 5.0 col1,
3   6.0 8.0 NaN col1,

Utilizzando tali informazioni è possibile assegnare i valori.

Migliore utilizzo:

df['col4'] = df.apply(
    lambda row: row[row.first_valid_index()] if np.isnan(row['col4']) else row['col4'],
    axis=1
)

Questo ti darà il risultato desiderato (dal momento che dobbiamo riempire NaN di col4)

   col1,col2,col3,col4
0   1.0 NaN NaN 1.0
1   NaN 3.0 NaN 3.0
2   4.0 NaN 5.0 4.0
3   6.0 8.0 NaN 9.0

Usa bfill e fillna

df['col4'] = df['col4'].fillna(df.bfill(1)['col1'])

Out[833]:
   col1  col2  col3  col4
0     1   NaN   NaN   1.0
1     2   3.0   NaN   2.0
2     4   NaN   5.0   4.0
3     6   8.0   NaN   9.0

Puoi semplicemente usare fillna e fillna sopra i nomi della colonna:

for col_name in df.columns[:-1]:
    df['col4'].fillna(df[col_name], inplace=True)

Questo ti darà:

   col1  col2  col3  col4
0     1   NaN   NaN   1.0
1     2   3.0   NaN   2.0
2     4   NaN   5.0   4.0
3     6   8.0   NaN   9.0

Related