Панды: Замените значение в столбце с помощью другого столбца, если условие истинно

#python #pandas #dataframe

Вопрос:

У меня есть следующий фрейм данных:

 df = pd.DataFrame({'ISIN': ['A1kT23', '4523', 'B333', '49O33'], 'Name': ['Example A', 'Name Xy', 'Example B', 'Test123'], 'Sector_x': ['test1', 'test2', 'test3', 'test4'],  'Sector_y': ['abc', '', '', 'xyz']})
 

Я хотел бы заменить значение в столбце Sector_y с помощью столбца Sector_x, если Sector_y = »

так что я получаю следующий результат:

 df = pd.DataFrame({'ISIN': ['A1kT23', '4523', 'B333', '49O33'], 'Name': ['Example A', 'Name Xy', 'Example B', 'Test123'], 'Sector_x': ['test1', 'test2', 'test3', 'test4'],  'Sector_y': ['abc', 'test2', 'test3', 'xyz']})
 

Я попытался использовать код

 df['Sector_y'] = np.where('',['Sector_x'],['Sector_y'])
 

но не добился желаемого результата.

Есть какие-нибудь предложения, как решить эту проблему?

Комментарии:

1. ваш синтаксис отключен: df['Sector_y'] = np.where(df['Sector_y'] == '',df['Sector_x'],df['Sector_y']) . Кроме того, вообще говоря, у вас всегда должен быть фрейм данных перед именем столбца-в противном случае вы передаете список с одной строкой вместо ряда фреймов данных. Очевидно, что если метод pandas ожидает список имен столбцов, как в groupby , то этот синтаксис работает, но np.where принимает: 1. условный ряд и либо ряд, либо строку.

Ответ №1:

Вы можете указать .loc условие фильтрации и указать целевой столбец Sector_y , а также назначить значения из столбца Sector_x следующим образом:

 df.loc[df['Sector_y'] =='', 'Sector_y'] = df['Sector_x']
 

Результат:

 print(df)

     ISIN       Name Sector_x Sector_y
0  A1kT23  Example A    test1      abc
1    4523    Name Xy    test2    test2
2    B333  Example B    test3    test3
3   49O33    Test123    test4      xyz

 

Ответ №2:

Чинить np.where

 df['Sector_y'] = np.where(df['Sector_y'] =='', df['Sector_x'], df['Sector_y'])
 

Ответ №3:

Другой вариант-использовать apply по строкам и просто сравнивать строки по столбцам с помощью or оператора (используя тот факт, что пустые строки оцениваются False как ):

 df['Sector_y'] = df.apply(lambda row: row['Sector_y'] or row['Sector_x'], axis=1)
 

выход:

      ISIN       Name Sector_x Sector_y
0  A1kT23  Example A    test1      abc
1    4523    Name Xy    test2    test2
2    B333  Example B    test3    test3
3   49O33    Test123    test4      xyz