Измените содержимое пустых столбцов в пандах, проверив значения в нескольких столбцах - PullRequest
0 голосов
/ 25 августа 2018

Как легко выполнить приведенную ниже операцию над кадром данных в пандах, используя меньшее количество шагов?

Ввод:

di = {'col1': ['1', '2', '5',None, None,'10', None,None], 
  'col2': ['4', '7', None, '8', None, None, '11',None], 
  'col3': ['9', None, '3', '8', None,None, None,'12'],
  'col4': ['abc', 'def', 'ghi', 'jkl', None,'mno', 'pqr',None],
  'col5': ['123', None, '456', '789', None,None, None,'012'],
  }

df = pd.DataFrame(di, dtype=object)

Входной фрейм данных:

embedded image

Требуемый выходной кадр данных:

embedded image

Метод, который я использовал:

df.loc[~df.col1.isnull() & df.col2.isnull() & df.col3.isnull(), ['col2','col3']] = 'Hello'

df.loc[df.col1.isnull() & ~df.col2.isnull() & df.col3.isnull(), ['col1','col3']] = 'Hello'

df.loc[df.col1.isnull() & df.col2.isnull() & ~df.col3.isnull(), ['col1','col2']] = 'Hello'

df.loc[~df.col1.isnull() & ~df.col2.isnull() & df.col3.isnull(), ['col3']] = 'Hello'

df.loc[df.col1.isnull() & ~df.col2.isnull() & ~df.col3.isnull(), ['col1']] = 'Hello'

df.loc[~df.col1.isnull() & df.col2.isnull() & ~df.col3.isnull(), ['col2']] = 'Hello'

Ответы [ 4 ]

0 голосов
/ 26 августа 2018

Если вы просто хотите применить его к этим трем столбцам:

cols = ['col1','col2','col3']
df[cols] = df[df.loc[:,cols].notnull().any(axis=1)][cols].fillna('Hello')
df = df.replace(dict({np.nan: None}))

print(df) 
    col1   col2   col3  col4  col5
0      1      4      9   abc   123
1      2      7  Hello   def  None
2      5  Hello      3   ghi   456
3  Hello      8      8   jkl   789
4   None   None   None  None  None
5     10  Hello  Hello   mno  None
6  Hello     11  Hello   pqr  None
7  Hello  Hello     12  None   012
0 голосов
/ 25 августа 2018

df.fillna('Hello', inplace=True). Используйте inplace с умом, прочитайте об этом.

0 голосов
/ 25 августа 2018

IIUC:

Вы хотите заполнить нулевые значения, кроме случаев, когда все они являются нулевыми значениями для строки.

m = df.isna().all(1)
df.fillna(‘Hello’).mask(m, df, axis=0)

ответил с моего телефона

0 голосов
/ 25 августа 2018

Я не уверен, правильно ли я вас понял, но если вы хотите заменить все значения None на «Hello», вы можете просто использовать:

df.fillna("Hello")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...