Как добавить новый столбец в фрейм данных в соответствии с правилом python?

#python #pandas #dataframe

#питон #панды #фрейм данных

Вопрос:

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

 import numpy as np  import pandas as pd   df = pd.DataFrame({'Name': ['Station', 'Station', 'Sensor', 'Sensor',   'Sensor', 'Sensor', 'Station', 'Station'],   'id': [10, 10, 11, 11, 12, 12, 13, 13]})   print(df)  

Выход:

 Name id  Station 10  Station 10  Sensor 11  Sensor 11  Sensor 12  Sensor 12  Station 13  Station 13  

В дополнение к этому фрейму данных у меня также есть массив с некоторыми идентификаторами:

 array_id = np.array([10, 11])  

Я хотел бы создать новый столбец во фрейме данных, называемый классом, и назначить метки «class1» и «class2». Для идентификаторов, принадлежащих «array_id», он получит «class1», а для идентификаторов, не принадлежащих «array_id», он получит «class2». Я попытался сделать это в соответствии со следующим кодом:

 # Create a new column with NaN  df['class'] = np.NaN   for i in range(0, len(df)):  for j in range(0, len(array_id)):     if(array_id[j] == df['id'].iloc[i]):   df['class'].iloc[i] = 'class1'  else:  df['class'].iloc[i] = 'class2'  

(Неправильный) вывод-это:

 print(df)   Name id class   Station 10 NaN  Station 10 NaN  Sensor 11 NaN  Sensor 11 NaN  Sensor 12 NaN  Sensor 12 NaN  Station 13 NaN  Station 13 NaN  

Я бы хотел, чтобы результат был:

 Name id class   Station 10 class1  Station 10 class1  Sensor 11 class1  Sensor 11 class1  Sensor 12 class2  Sensor 12 class2  Station 13 class2  Station 13 class2  

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

1. df['class'] = np.where(df['id'].isin(array_id), 'class1', 'class2') .

2. @QuangHoang Вы можете добавить «Использовать:» перед ним и заставить его ответить

Ответ №1:

Если вы хотите использовать только pandas без numpy , вы можете использовать loc и fillna :

 df.loc[df.id.isin(array_id),'class'] = 'class1' df['class'].fillna('class2',inplace=True)  

 Name id class 0 Station 10 class1 1 Station 10 class1 2 Sensor 11 class1 3 Sensor 11 class1 4 Sensor 12 class2 5 Sensor 12 class2 6 Station 13 class2 7 Station 13 class2