#python #pandas
#python #pandas
Вопрос:
Мне нужно создать новый столбец, indicator
который принимает значение code
. Я не могу использовать операторы if else, потому что code
могут иметь значение и то же значение где-то еще в столбце second code
. Любая помощь была бы оценена.
import pandas as pd
df = pd.DataFrame({
'date': ['2019-04-19','2019-04-20','2019-05-03', '2019-05-04',
'2019-10-01','2019-10-07','2019-10-11', '2019-11-20'],
'category': ['ID F', 'ID F', 'ID F', 'ID F',
'ID B', 'ID B', 'ID B', 'ID B'],
'code': ['None', 'None', 'None', '8008',
'None', 'None', '9001', 'None'],
'second_code': ['None', 'None', '8008', 'None',
'None', 'None', 'None', 'None']})
df['date'] = pd.to_datetime(df['date'], infer_datetime_format=True)
date category code second_code
0 2019-04-19 ID F None None
1 2019-04-20 ID F None None
2 2019-05-03 ID F None 8008
3 2019-05-04 ID F 8008 None
4 2019-10-01 ID B None None
5 2019-10-07 ID B None None
6 2019-10-11 ID B 9001 None
7 2019-11-20 ID B None None
Требуемый фрейм данных
date category code second_code indicator
0 2019-04-19 ID F None None None
1 2019-04-20 ID F None None None
2 2019-05-03 ID F None 8008 8008
3 2019-05-04 ID F 8008 None None
4 2019-10-01 ID B None None None
5 2019-10-07 ID B None None None
6 2019-10-11 ID B 9001 None 9001
7 2019-11-20 ID B None None None
Редактировать:
Я пробовал:
df['indicator'] = np.where(df['new_code'].notnull(), df['new_code'], np.where(df['code']).notnull(), df['code'], np.nan)
но я получаю ошибку AttributeError: 'tuple' object has no attribute 'notna'
Комментарии:
1. Почему в вашей строке
3
есть индикаторNone
?2. похоже, проблема с заполнением
3. @QuangHoang потому что это значение было перенесено из другого столбца (т. Е. Фактически оно связано с 2019-05-03, а не с 2019-05-04)
4. Как вы можете определить, когда использовать второй код против кода в вашем ответе?
Ответ №1:
Самым простым способом должно быть использование fillna
функции вместе с drop_duplicates
, чтобы гарантировать, что мы получим первый раз, когда определенный код отображается в столбце.
# First we need to replace the "None" with actual NaN values
df = df.replace("None", np.nan)
df["indicator"] = df["second_code"].fillna(df["code"]).drop_duplicates()
df
date category code second_code indicator
0 2019-04-19 ID F NaN NaN NaN
1 2019-04-20 ID F NaN NaN NaN
2 2019-05-03 ID F NaN 8008 8008
3 2019-05-04 ID F 8008 NaN NaN
4 2019-10-01 ID B NaN NaN NaN
5 2019-10-07 ID B NaN NaN NaN
6 2019-10-11 ID B 9001 NaN 9001
7 2019-11-20 ID B NaN NaN NaN
По сути, я говорю pandas: возьмите столбец «second_code» и заполните все пропущенные значения (NaN) в «second_code» значениями из «code». Затем избавьтесь от любых потенциальных дублирующихся записей из вышеупомянутой операции и присвоите этот результат столбцу «индикатор».
Ответ №2:
Попробуй вот это.
import pandas as pd
df = pd.DataFrame({
'date': ['2019-04-19','2019-04-20','2019-05-03', '2019-05-04',
'2019-10-01','2019-10-07','2019-10-11', '2019-11-20'],
'category': ['ID F', 'ID F', 'ID F', 'ID F',
'ID B', 'ID B', 'ID B', 'ID B'],
'code': ['None', 'None', 'None', '8008',
'None', 'None', '9001', 'None'],
'second_code': ['None', 'None', '8008', 'None',
'None', 'None', 'None', 'None']})
df['date'] = pd.to_datetime(df['date'], infer_datetime_format=True)
df['indicator'] = df['code']
print(df)
выход.
date category code second_code indicator
0 2019-04-19 ID F None None None
1 2019-04-20 ID F None None None
2 2019-05-03 ID F None 8008 None
3 2019-05-04 ID F 8008 None 8008
4 2019-10-01 ID B None None None
5 2019-10-07 ID B None None None
6 2019-10-11 ID B 9001 None 9001
7 2019-11-20 ID B None None None
Подробнее читайте здесь https://pandas.pydata.org/docs/getting_started/intro_tutorials/05_add_columns.html , в документации есть все.
Комментарии:
1. это неверно — пожалуйста, посмотрите на строки 2: 3 в желаемом фрейме данных в вопросе.