2012-08-23 15 views
16

pandas oferuje możliwość zajrzeć przez wykazy indeksów wierszy i kolumn,pandy: zestaw wartości z (wiersz, kol) wskaźników

In [49]: index = ['a', 'b', 'c', 'd'] 

In [50]: columns = ['one', 'two', 'three', 'four'] 

In [51]: M = pandas.DataFrame(np.random.randn(4,4), index=index, columns=columns) 

In [52]: M 
Out[52]: 
     one  two  three  four 
a -0.785841 -0.538572 0.376594 1.316647 
b 0.530288 -0.975547 1.063946 -1.049940 
c -0.794447 -0.886721 1.794326 -0.714834 
d -0.158371 0.069357 -1.003039 -0.807431 

In [53]: M.lookup(index, columns) # diagonal entries 
Out[53]: array([-0.78584142, -0.97554698, 1.79432641, -0.8074308 ]) 

Chciałbym skorzystać z tej samej metody indeksowania ustawić M ' elementy s. Jak mogę to zrobić?

+0

Możliwy duplikat [Jak uzyskać wartość z komórki ramki danych?] (https://stackoverflow.com/q/16729574/1278112) –

Odpowiedz

18

nie jestem pewien, że za tobą, ale używacie DataFrame.ix aby wybrać/ustawić indywidualne elementy:

In [79]: M 
Out[79]: 
     one  two  three  four 
a -0.277981 1.500188 -0.876751 -0.389292 
b -0.705835 0.108890 -1.502786 -0.302773 
c 0.880042 -0.056620 -0.550164 -0.409458 
d 0.704202 0.619031 0.274018 -1.755726 

In [75]: M.ix[0] 
Out[75]: 
one  -0.277981 
two  1.500188 
three -0.876751 
four -0.389292 
Name: a 

In [78]: M.ix[0,0] 
Out[78]: -0.27798082190723405 

In [81]: M.ix[0,0] = 1.0 

In [82]: M 
Out[82]: 
     one  two  three  four 
a 1.000000 1.500188 -0.876751 -0.389292 
b -0.705835 0.108890 -1.502786 -0.302773 
c 0.880042 -0.056620 -0.550164 -0.409458 
d 0.704202 0.619031 0.274018 -1.755726 

In [84]: M.ix[(0,1),(0,1)] = 1 

In [85]: M 
Out[85]: 
     one  two  three  four 
a 1.000000 1.000000 -0.876751 -0.389292 
b 1.000000 1.000000 -1.502786 -0.302773 
c 0.880042 -0.056620 -0.550164 -0.409458 
d 0.704202 0.619031 0.274018 -1.755726 

Można również pokroić przez indeksów:

In [98]: M.ix["a":"c","one"] = 2.0 

In [99]: M 
Out[99]: 
     one  two  three  four 
a 2.000000 1.000000 -0.876751 -0.389292 
b 2.000000 1.000000 -1.502786 -0.302773 
c 2.000000 -0.056620 -0.550164 -0.409458 
d 0.704202 0.619031 0.274018 -1.755726 
+2

Spowoduje to ustawienie poszczególnych elementów, ale z podaniem listy par (wiersza, indeksu, wartości), czy istnieje jakikolwiek łatwy sposób na ich ustawienie wszystko na raz? – duckworthd

+1

Nie sądzę, że istnieje, trzeba iterować po krotkach (wiersz, indeks, wartość) i ustawić wartość jeden po drugim. Jeśli masz trzy listy index_labels, column_labels, wartości te wygląda jak rozszerzenie todo M.set_value => M.set_value (index_labels, column_labels, values). Inną opcją jest użycie M.update(), ale tutaj musisz najpierw utworzyć inną ramkę. –

+0

Możesz przekazać krotkę/listę do ix(), aby ustawić wartości w ramce danych. Zobacz edycję powyżej. Na przykład M.ix [(0,1), (0,1)] = 1 – reptilicus

15

Wiele lat minęło ponieważ ta odpowiedź została napisana, więc chociaż mógłbym się trochę przyczynić. Z refaktoringu pand, próbując ustawić wartość w miejscu z

M.iloc[index][col] 

może dać ostrzeżenie o próbując ustawić wartość w segmencie.

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

See the the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy 

wierzę bardziej „pythonic” sposób to zrobić w chwili obecnej jest z instrukcją pandas.DataFrame.set_value. Zwróć uwagę, że ta instrukcja zwraca wynikową ramkę DataFrame.

M.set_value(index,column,new_value) 

Pomyślałem, że mogę napisać to tutaj po zastanawianie się źródło ostrzeżeń, które mogą być generowane przez .iloc lub .IX podejść.

SET_VALUE podejście działa również dla multiindex DataFrames przez umieszczenie wielu poziomów wskaźnika w postaci krotki (np wymianie kolumny (COL subcol))

+0

Dzięki za opublikowanie tego, dzisiaj mój "profesor" w klasie Data Science na dużej uczelni powiedział mi, że lepiej jest robić kopie i operować na całych kolumnach dataframes vs. "modyfikowanie jednej wartości naraz" (z obowiązkiem) - co i tak robi poprzednia opcja! W tej odpowiedzi jest prawdziwe wykształcenie, którego po prostu nie można zapłacić za haha. Podany link jest świetny: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy również poza tematem, ale interesujący jest http://pandas.pydata.org /pandas-docs/stable/gotchas.html – JimLohse

Powiązane problemy