#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