Pandas DataFrame: замініть усі значення в стовпці, виходячи з умови


132

У мене є проста DataFrame на зразок наступного:

Панди DataFrame

Я хочу вибрати всі значення зі стовпця "Перший сезон" і замінити значення, які перевищили 1990 рік, на 1. У цьому прикладі тільки Балтімор Воронів замінив би 1996 р. На 1 (залишивши всі дані недоторканими).

Я використав наступне:

df.loc[(df['First Season'] > 1990)] = 1

Але він замінює всі значення в цьому рядку на 1, а не лише значення у стовпці "Перший сезон".

Як я можу замінити лише значення з цього стовпця?

Відповіді:


226

Вам потрібно вибрати цей стовпець:

In [41]:
df.loc[df['First Season'] > 1990, 'First Season'] = 1
df

Out[41]:
                 Team  First Season  Total Games
0      Dallas Cowboys          1960          894
1       Chicago Bears          1920         1357
2   Green Bay Packers          1921         1339
3      Miami Dolphins          1966          792
4    Baltimore Ravens             1          326
5  San Franciso 49ers          1950         1003

Отже, синтаксис тут:

df.loc[<mask>(here mask is generating the labels to index) , <optional column(s)> ]

Ви можете перевірити документи, а також 10 хвилин до панд, що показує семантику

EDIT

Якщо ви хочете створити логічний індикатор , то ви можете просто використовувати логічне умова для створення булевої серії і кастовать DTYPE на intце буде конвертувати Trueі Falseв 1і 0відповідно:

In [43]:
df['First Season'] = (df['First Season'] > 1990).astype(int)
df

Out[43]:
                 Team  First Season  Total Games
0      Dallas Cowboys             0          894
1       Chicago Bears             0         1357
2   Green Bay Packers             0         1339
3      Miami Dolphins             0          792
4    Baltimore Ravens             1          326
5  San Franciso 49ers             0         1003

40

Трохи запізнюємось на вечірку, але все ж - я вважаю за краще використовувати numpy де:

import numpy as np
df['First Season'] = np.where(df['First Season'] > 1990, 1, df['First Season'])

2
Я шукав рішення для перезапису значень стовпців умовно, але виходячи зі значення іншого стовпця, наприклад цього: df ['col1'] = np.where (df ['id'] == '318431682259014', 'NEW', df ['col1']) Це було рішенням для цього.
користувач582175

Я намагаюся зробити це для кількох подібних умов, але продовжую отримувати ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). Те, що я намагаюся зробити, це в основному df['A'] = np.where(df['B'] in some_values, df['A']*2, df['A]. Хтось має ідею з цього приводу?
М.Шальк

6
df['First Season'].loc[(df['First Season'] > 1990)] = 1

дивно, що ніхто не має такої відповіді. Єдиною частиною вашого коду є ['Перший сезон'] відразу після df і просто видаліть фігурні дужки всередині.


Це дає "SettingWithCopyWarning:" Краще використовувати .loc для всієї речі, як у відповіді EdChum.
ambiciousdonut

2

за єдину умову, тобто. ( 'employrate'] > 70 )

       country        employrate alcconsumption
0  Afghanistan  55.7000007629394            .03
1      Albania  51.4000015258789           7.29
2      Algeria              50.5            .69
3      Andorra                            10.17
4       Angola  75.6999969482422           5.57

використовуй це:

df.loc[df['employrate'] > 70, 'employrate'] = 7

       country  employrate alcconsumption
0  Afghanistan   55.700001            .03
1      Albania   51.400002           7.29
2      Algeria   50.500000            .69
3      Andorra         nan          10.17
4       Angola    7.000000           5.57

тому синтаксис тут:

df.loc[<mask>(here mask is generating the labels to index) , <optional column(s)> ]

При множинних умовах, тобто. (df['employrate'] <=55) & (df['employrate'] > 50)

використовуй це:

df['employrate'] = np.where(
   (df['employrate'] <=55) & (df['employrate'] > 50) , 11, df['employrate']
   )

out[108]:
       country  employrate alcconsumption
0  Afghanistan   55.700001            .03
1      Albania   11.000000           7.29
2      Algeria   11.000000            .69
3      Andorra         nan          10.17
4       Angola   75.699997           5.57

тому синтаксис тут:

 df['<column_name>'] = np.where((<filter 1> ) & (<filter 2>) , <new value>, df['column_name'])

0
df.loc[df['First season'] > 1990, 'First Season'] = 1

Пояснення:

df.locбере два аргументи: 'індекс рядків' та 'індекс стовпців'. Ми перевіряємо, чи не перевищує 27 значення кожного рядка в колонці "Перший сезон", а потім замінюємо його на 1.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.