Ich habe einen Datenrahmen wie folgt aus:Wie die Zuordnung zu einer hierarchischen Spalte von Pandas Datenrahmen mit Boolean Maske?
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
Ich mag würde einige Werte, die einen Booleschen Filter entsprechen ändern. z.B .:
ix = df.val1 > 20
print ix
site a b
time
1 False True
2 False True
Eine natürliche Sache, zu versuchen df.val1[ix] = 50
wäre. Dies führt die erwartete Zuweisung durch, gibt jedoch eine Warnung: 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
.
So jetzt versuche ich etwas ähnliches mit df.loc
zu erreichen. Aber ich kann keine Möglichkeit finden, df.loc
mit dieser Art von booleschen Maske zu verwenden. Dies scheint zu sein, weil ich hierarchische Spalten verwende, d. H. Ich habe keine großen Probleme, wenn ich nur einen Satz von Werten (val1) habe. Leider sind Zuordnungen mit booleschen Filtern für hierarchische Spalten in docs nicht sehr gut abgedeckt.
Ich habe versucht, bezogen auf df.loc[:,'val1',ix]
, aber das gibt IndexingError: Too many indexers
. Ich habe versucht df.loc[:,'val1'][ix] = 50
, und das funktioniert, aber gibt die SettingWithCopyWarning
.
Ich kann df.val1 = df.val1.where(~ix, other=50)
verwenden, aber das scheint nicht intuitiv, ineffizient und unflexibel (z. B. könnte es nicht einfach erweitert werden, 10 zu den vorhandenen Werten hinzuzufügen).
Gibt es eine andere Indexierungsmethode, die ich verwenden sollte, um Werte einer hierarchischen Spalte eines Datenrahmens basierend auf einer booleschen Maske zuzuordnen?
Ich wusste nicht, das wäre ein Problem, aber ich würde wirklich filtern wie basierend auf den Werten in den beiden val1
und val2
Spalten und Änderungswerte in beiden:
Edited die Frage erweitern Sätze von Spalten, etwa wie folgt:
ix = (df.val1 > 20) | (df.val2 < 102)
df.val1[ix] = 50
df.val2[ix] = 150
gibt es eine einfache Indizierung Ansatz, dies zu tun? Es ist ziemlich einfach mit numpy ndarrays, aber scheint mit einem Pandas Datenrahmen viel kniffliger zu sein.
wäre es eine Option für Sie, Ihre Spalten zu reduzieren? – MaxU