Панды: Заменить столбец данных, если это `NaN` - PullRequest
0 голосов
/ 23 марта 2019

У меня есть датафрейм с большим количеством столбцов. Один столбец может иметь NaN. В этих случаях значение можно найти в следующем столбце.

Чтобы упростить ... Это здесь:

In[1]:

d = {'col1': [1, 2, 3], 
     'col2': [5, np.nan, np.nan],
     'col3': [55, 9, 22]}
df = pd.DataFrame(data=d)
print(tabulate(df, headers = 'keys', tablefmt = 'psql'))

Out[1]:

+----+--------+--------+--------+
|    |   col1 |   col2 |   col3 |
|----+--------+--------+--------|
|  0 |      1 |      5 |     55 |
|  1 |      2 |    nan |      9 |
|  2 |      3 |    nan |     22 |
+----+--------+--------+--------+

Должно стать вот так:

In[2]:

d = {'col1': [1, 2, 3], 
     'col2': [5, 9, 22],
     'col3': [55, 9, 22]}
df = pd.DataFrame(data=d)
print(tabulate(df, headers = 'keys', tablefmt = 'psql'))

Out[2]:
+----+--------+--------+--------+
|    |   col1 |   col2 |   col3 |
|----+--------+--------+--------|
|  0 |      1 |      5 |     55 |
|  1 |      2 |      9 | <==  9 |  # col3's value copied to col2
|  2 |      3 |     22 | <== 22 |  # col3's value copied to col2
+----+--------+--------+--------+

Я попробовал это (без успеха):

df.loc[ df['col2'].isna() ] = df[ df['col2'].isna() ]['col3']

Любой совет?

Ответы [ 3 ]

2 голосов
/ 23 марта 2019

Вам нужно заполнить в обратном порядке, по строкам:

df.bfill(axis=1)
#   col1  col2  col3
#0   1.0   5.0  55.0
#1   2.0   9.0   9.0
#2   3.0  22.0  22.0
1 голос
/ 23 марта 2019

Также

d['col2'].fillna(d['col3'], inplace = True)
1 голос
/ 23 марта 2019

Да, вы можете просто использовать np.where

df.col2=np.where(df.col2.isna(),df.col3,df.col2)
df
Out[535]: 
   col1  col2  col3
0     1   5.0    55
1     2   9.0     9
2     3  22.0    22

Для исправления вашего кода используйте .loc

df.loc[ df['col2'].isna(),'col2' ] = df[ df['col2'].isna() ]['col3']
df
Out[538]: 
   col1  col2  col3
0     1   5.0    55
1     2   9.0     9
2     3  22.0    22
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...