Супер просте призначення стовпців
Кадр даних панди реалізований як упорядкований диктант стовпців.
Це означає, що __getitem__
[]
не тільки можна використовувати для отримання певного стовпця, але й __setitem__
[] =
можна використовувати для призначення нового стовпця.
Наприклад, до цього фрейму даних може бути доданий стовпець, просто використовуючи []
аксесуар
size name color
0 big rose red
1 small violet blue
2 small tulip red
3 small harebell blue
df['protected'] = ['no', 'no', 'no', 'yes']
size name color protected
0 big rose red no
1 small violet blue no
2 small tulip red no
3 small harebell blue yes
Зауважте, що це працює, навіть якщо індекс фрейму даних вимкнено.
df.index = [3,2,1,0]
df['protected'] = ['no', 'no', 'no', 'yes']
size name color protected
3 big rose red no
2 small violet blue no
1 small tulip red no
0 small harebell blue yes
[] = це шлях, але слідкуйте!
Однак якщо у вас є pd.Series
і спробуєте призначити його в кадр даних, де індекси вимкнено, ви зіткнетеся з проблемою. Див. Приклад:
df['protected'] = pd.Series(['no', 'no', 'no', 'yes'])
size name color protected
3 big rose red yes
2 small violet blue no
1 small tulip red no
0 small harebell blue no
Це тому, що pd.Series
за замовчуванням індекс перераховується від 0 до n. І [] =
метод панди намагається бути "розумним"
Що насправді відбувається.
При використанні [] =
методу панди тихо виконують зовнішнє з'єднання або зовнішнє злиття, використовуючи індекс лівої рамки даних та індекс рядка правої руки.df['column'] = series
Бічна примітка
Це швидко викликає когнітивний дисонанс, оскільки []=
метод намагається зробити багато різних речей залежно від вкладених даних, і результат неможливо передбачити, якщо ви просто не знаєте, як працює панда. Тому я б порадив проти []=
кодових баз, але при дослідженні даних у зошиті це добре.
Обхід проблеми
Якщо у вас є pd.Series
і хочете, щоб він був призначений зверху вниз, або якщо ви кодуєте продуктивний код і не впевнені в порядку індексу, варто його захистити для такого виду.
Ви можете pd.Series
скористатись «a» np.ndarray
чи «a» list
, це зробить трюк.
df['protected'] = pd.Series(['no', 'no', 'no', 'yes']).values
або
df['protected'] = list(pd.Series(['no', 'no', 'no', 'yes']))
Але це не дуже явно.
Можливо, прийде якийсь кодер і каже "Ей, це виглядає зайвим, я просто оптимізую це".
Явний спосіб
Встановлення індексу до того, pd.Series
щоб бути індексом, df
є явним.
df['protected'] = pd.Series(['no', 'no', 'no', 'yes'], index=df.index)
Або, що більш реально, у вас, мабуть, pd.Series
вже є.
protected_series = pd.Series(['no', 'no', 'no', 'yes'])
protected_series.index = df.index
3 no
2 no
1 no
0 yes
Тепер можна призначити
df['protected'] = protected_series
size name color protected
3 big rose red no
2 small violet blue no
1 small tulip red no
0 small harebell blue yes
Альтернативний спосіб з df.reset_index()
Оскільки індексний дисонанс є проблемою, якщо ви відчуваєте, що індекс фрейму даних не повинен диктувати речі, ви можете просто скинути індекс, це повинно бути швидше, але це не дуже чисто, оскільки ваша функція зараз, ймовірно, виконує дві речі.
df.reset_index(drop=True)
protected_series.reset_index(drop=True)
df['protected'] = protected_series
size name color protected
0 big rose red no
1 small violet blue no
2 small tulip red no
3 small harebell blue yes
Примітка df.assign
Хоча виразніше df.assign
зробіть те, що ви робите, це насправді має всі ті ж проблеми, що і вище[]=
df.assign(protected=pd.Series(['no', 'no', 'no', 'yes']))
size name color protected
3 big rose red yes
2 small violet blue no
1 small tulip red no
0 small harebell blue no
Просто слідкуйте, df.assign
щоб ваш стовпець не називався self
. Це призведе до помилок. Це стає df.assign
смердючим , оскільки є такі види артефактів у функції.
df.assign(self=pd.Series(['no', 'no', 'no', 'yes'])
TypeError: assign() got multiple values for keyword argument 'self'
Ви можете сказати: "Ну, я просто self
тоді не буду користуватися ". Але хто знає, як ця функція змінюється в майбутньому для підтримки нових аргументів. Можливо, назва вашого стовпця буде аргументом у новому оновленні панд, що спричинить проблеми з оновленням.