2015-09-02 11 views
5

Mam pandasową ramkę danych z dwiema kolumnami: x i wartością. Chcę znaleźć wszystkie wiersze, w których x == 10, a dla wszystkich tych wierszy ustaw wartość = 1000. Próbowałem poniższy kod, ale pojawia się ostrzeżenie, żepython pandy: jak uniknąć przykutego przypisania

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

rozumiem mogę tego uniknąć stosując .LOC lub .IX, ale chciałbym najpierw trzeba znaleźć lokalizację lub indeksy wszystkich wierszy, które spełniają mój stan x == 10. Czy istnieje bardziej bezpośredni sposób?

Dzięki!

import numpy as np 
import pandas as pd 

df=pd.DataFrame() 
df['x']=np.arange(10,14) 
df['value']=np.arange(200,204) 


print df 

df[ df['x']== 10 ]['value'] = 1000 # this doesn't work 

print df 
+2

Przepraszam, co jest nie tak z użyciem zalecanego pliku 'df.loc [df ['x'] == 10, 'value'] = 1000'? – EdChum

+1

Dzięki, nie zdawałem sobie sprawy, że to opcja. Może to tylko ja, może dlatego, że jestem zbytnio przyzwyczajony do SQL i zbyt nowy w Pandach, ale nadal uważam, że niektóre zadania, które są banalne w SQL, są niechlujne w pandach, a dokumentacja nie jest zbyt jasna –

+0

[docs] (http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy) są dość jasne i pojawia się ostrzeżenie informujące, że to, co robisz, może nie działać – EdChum

Odpowiedz

3

Należy użyć loc, aby zapewnić sobie pracę na widoku, na przykład dodaje zadziała i nie podnieść ostrzeżenie:

df.loc[df['x'] == 10, 'value'] = 1000 

więc powszechną formą jest:

df.loc[<mask or index label values>, <optional column>] = < new scalar value or array like> 

The docs podkreśla błędy i jest intro, z niektórymi dokumentami funkcji są rzadkie, zachęcamy do przesyłania ulepszeń.

Powiązane problemy