Jeg har oprettet et Pandas DataFrame
df = DataFrame(index=['A','B','C'], columns=['x','y'])
og fik dette
x y A NaN NaN NaN B NaN NaN NaN C NaN NaN NaN
x y A NaN NaN NaN B NaN NaN NaN C 10 NaN
med denne kode:
df.xs('C')['x'] = 10
men indholdet af df
er ikke ændret. Det er igen kun NaN
s i DataFrame.
Nogen forslag?
RukTech's svar, df.set_value('C', 'x', 10)
, er langt hurtigere end de muligheder, jeg har foreslået nedenfor. Den er dog blevet [slated for deprecation] (https://github.com/pandas-dev/pandas/issues/15269).
Fremover er den [anbefalede metode .iat/.at
] (https://github.com/pandas-dev/pandas/issues/15269#issuecomment-276382712).
Hvorfor df.xs('C')['x']=10
ikke virker:
df.xs('C')
returnerer som standard et nyt dataframe med en kopi af dataene, så
df.xs('C')['x']=10
kun ændrer dette nye dataframe.
df['x']
returnerer en visning af df
datarammen, så
df['x']['C'] = 10
ændrer df
selv.
Varsling: Det er nogle gange svært at forudsige, om en operation returnerer en kopi eller en visning. Af denne grund anbefaler docs at undgå opgaver med "chained indexing"1.
Så det anbefalede alternativ er
df.at['C', 'x'] = 10
som gør ændring af df
.
In [18]: %timeit df.set_value('C', 'x', 10)
100000 loops, best of 3: 2.9 µs per loop
In [20]: %timeit df['x']['C'] = 10
100000 loops, best of 3: 6.31 µs per loop
In [81]: %timeit df.at['C', 'x'] = 10
100000 loops, best of 3: 9.2 µs per loop
Den anbefalede måde (ifølge vedligeholderne) at indstille en værdi på er:
df.ix['x','C']=10
Brug af 'chained indexing'; (df['x']['C']
) kan føre til problemer.
Se: