我有這樣一個數據幀:如何使用布爾掩碼來分配給熊貓數據框的層次列?
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添加到現有值)。
是否有一些其他的索引方法,我應該使用基於布爾值掩碼爲數據框的分層列賦值?
編輯延長問題:
我沒有意識到這將是一個問題,但我確實喜歡基於val1
和val2
列和變化值都在這兩個值過濾套列,如下所示:
ix = (df.val1 > 20) | (df.val2 < 102)
df.val1[ix] = 50
df.val2[ix] = 150
是否有一個簡單的索引方法可以做到這一點? numpy ndarrays很容易,但對於熊貓數據框來說似乎更加棘手。
它會是一個選項,你扁平你的專欄? – MaxU