Pandas — Заполнение или функция where, основанная на условии

#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 в желаемом фрейме данных в вопросе.