как использовать значения в других столбцах, чтобы заполнить nan одного столбца в Pandas - PullRequest
0 голосов
/ 21 февраля 2020

Мне нужно заполнить значение nan значениями в других столбцах, например, у меня есть df, например:

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

Мне нужно превратить df выше в

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

Я хочу перебрать col1 ~ col3 и получить первое доступное значение для этой строки и использовать это значение для замены nan в col4, однако, если строка в col4 уже имеет значение, тогда игнорируйте эту строку.

Мне сообщили, что зацикливание на кадре данных не идеально, какие у меня есть другие варианты?

Ответы [ 3 ]

1 голос
/ 21 февраля 2020

Используйте bfill и 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
1 голос
/ 21 февраля 2020

Попробуйте:

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

Вывод:

   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))

Это даст вам:

   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,

Используя эту информацию, вы можете присвоить значения.

Лучшее использование:

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

Это даст вам желаемый результат (так как мы должны заполнить NaN из 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
0 голосов
/ 21 февраля 2020

Вы можете просто использовать fillna и l oop над именами столбца:

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

Это даст вам:

   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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...