#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