Индексирование строк по логическому выражению и столбца по позиции pandas фрейм данных - PullRequest
1 голос
/ 31 марта 2020

Как установить значения среза pandas данных, где строки выбираются логическим выражением, а столбцы - позицией?

До сих пор я делал это следующим образом :

>>> vals = [5,7]
>>> df = pd.DataFrame({'a':[1,2,3,4], 'b':[5,5,7,7]})
>>> df
   a  b
0  1  5
1  2  5
2  3  7
3  4  7
>>> df.iloc[:,1][df.iloc[:,1] == vals[0]] = 0
>>> df
   a  b
0  1  0
1  2  0
2  3  7
3  4  7

Это работает, как и ожидалось, на этом небольшом примере, но дает мне следующее предупреждение на моем реальном фрейме данных:

SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

Каков рекомендуемый способ достижения этого?

Ответы [ 2 ]

2 голосов
/ 31 марта 2020

Использование DataFrame.columns и DataFrame.loc:

col = df.columns[1]
df.loc[df.loc[:,col] == vals[0], col] = 0
1 голос
/ 31 марта 2020

Один из способов - использовать индекс заголовка столбца и loc (индексирование на основе меток):

df.loc[df.iloc[:, 1] == vals[0], df.columns[1]] = 0

Другой способ - использовать np.where с iloc (целочисленная индексация позиции), np .where возвращает кортеж строки, позиции индекса столбца, где True:

df.iloc[np.where(df.iloc[:, 1] == vals[0])[0], 1] = 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...