У меня есть dataframe вроде этого:Как назначить иерархический столбец фрейма данных pandas с помощью булевой маски?
import pandas as pd
df = pd.DataFrame({
"time": [1, 2, 1, 2],
"site": ['a', 'a', 'b', 'b'],
"val1": [11, 12, 21, 22],
"val2": [101, 102, 201, 202]
})
df.set_index(['time', 'site'], inplace=True, append=False)
df = df.unstack("site")
print df
val1 val2
site a b a b
time
1 11 21 101 201
2 12 22 102 202
Я хотел бы изменить некоторые значения, которые соответствуют булеву фильтру. например .:
ix = df.val1 > 20
print ix
site a b
time
1 False True
2 False True
естественная вещь, чтобы попытаться будет df.val1[ix] = 50
. Это соответствует ожидаемому назначению, но дает предупреждение: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead
.
Так что теперь я пытаюсь достичь чего-то подобного, используя df.loc
. Но я не могу найти способ использовать df.loc
с этой булевой маской. Кажется, это связано с тем, что я использую иерархические столбцы, т. Е. У меня нет особых проблем, если у меня есть только один набор значений (val1). К сожалению, задания с булевыми фильтрами в иерархических столбцах не очень хорошо описаны в docs.
Я пробовал ссылаться на df.loc[:,'val1',ix]
, но это дает IndexingError: Too many indexers
. Я пробовал df.loc[:,'val1'][ix] = 50
, и это работает, но дает SettingWithCopyWarning
.
Я могу использовать df.val1 = df.val1.where(~ix, other=50)
, но это кажется неинтуитивным, неэффективным и негибким (например, его нельзя было легко расширить, добавив 10 к существующим значениям).
Есть ли какой-нибудь другой метод индексирования, который я должен использовать для назначения значений иерархическому столбцу фрейма данных на основе булевой маски?
Edited расширить вопрос:
Я не понимаю, что это было бы проблемой, но я на самом деле хотел, чтобы фильтровать на основе значений в обоих val1
и val2
столбцов и значений изменения в обоих наборы колонок, что-то вроде этого:
ix = (df.val1 > 20) | (df.val2 < 102)
df.val1[ix] = 50
df.val2[ix] = 150
Есть ли простой подход к индексированию, который может это сделать? Это довольно легко с numpy ndarrays, но, похоже, намного сложнее с фреймворком pandas.
Возможно ли это, чтобы вы могли сгладить свои столбцы? – MaxU