Stworzyłem Pandas DataFrame
df = DataFrame(index=['A','B','C'], columns=['x','y'])
i mam to
xy NaN NaN B NaN NaN C NaN NaN
Następnie chcę przypisać wartość do konkretnej komórki, na przykład dla wiersza „C” i kolumny „x”. Spodziewałem się takiego wyniku:
xy NaN NaN B NaN NaN C 10 NaN
z tym kodem:
df.xs('C')['x'] = 10
ale zawartość df
się nie zmieniła. Znowu jest tylko NaN
w DataFrame.
Jakieś sugestie?
df['x']['C']
), użyjdf.ix['x','C']
.dataframe[column (series)] [row (Series index)]
podczas gdy wiele osób (w tym ja) jest bardziej przyzwyczajonych do tejdataframe[row][column]
kolejności. Jako programista Matlab i R. ten ostatni wydaje mi się bardziej intuicyjny, ale najwyraźniej nie tak działa Pandas ..Odpowiedzi:
Odpowiedź RukTech za ,
df.set_value('C', 'x', 10)
jest daleko i szybciej niż opcje mam sugerowanych poniżej. Zostało jednak przeznaczone na wycofanie .W przyszłości zalecaną metodą jest
.iat/.at
.Dlaczego
df.xs('C')['x']=10
nie działa:df.xs('C')
domyślnie zwraca nową ramkę danych z kopią danych, więcmodyfikuje tylko tę nową ramkę danych.
df['x']
zwraca widokdf
ramki danych, więcmodyfikuje
df
się.Ostrzeżenie : Czasami trudno jest przewidzieć, czy operacja zwraca kopię lub widok. Z tego powodu doktorzy zalecają unikanie zadań z „indeksowaniem łańcuchowym” .
Tak więc zalecaną alternatywą jest
który się modyfikuje
df
.źródło
df.x
w API . Co miałeś na myśli?'x'
to nazwa kolumny wdf
.df.x
zwraca aSeries
z wartościami w kolumniex
. Zmienię to na,df['x']
ponieważ ta notacja będzie działać z dowolną nazwą kolumny (w przeciwieństwie do notacji kropkowej) i myślę, że jest jaśniejsza.df.x
obok jest jakaś nieznana nowa metodadf.xs, df.ix
df.xs(..., copy=True)
zwraca kopię, a to jest zachowanie domyślne.df.xs(..., copy=False)
zwraca oryginał.Aktualizacja:
.set_value
metoda będzie przestarzała ..iat/.at
są dobrymi zamiennikami, niestety pandy dostarczają mało dokumentacjiNajszybszym sposobem na to jest użycie set_value . Ta metoda jest ~ 100 razy szybsza niż
.ix
metoda. Na przykład:df.set_value('C', 'x', 10)
źródło
df['x']['C'] = 10
.df=df.append(df.sum(numeric_only=True),ignore_index=True)
?Możesz także skorzystać z wyszukiwania warunkowego, korzystając z
.loc
poniższego przykładu:gdzie
<some_column_name
jest kolumna, dla której chcesz sprawdzić<condition>
zmienną względem i<another_column_name>
jest kolumna, do której chcesz dodać (może to być nowa kolumna lub kolumna, która już istnieje).<value_to_add>
to wartość, którą chcesz dodać do tej kolumny / wiersza.Ten przykład nie działa dokładnie z danym pytaniem, ale może być przydatny dla kogoś, kto chce dodać konkretną wartość na podstawie warunku.
źródło
df.loc[df['age']==3, ['age-group']] = 'toddler'
Zalecanym sposobem (według opiekunów) ustawienia wartości jest:
Korzystanie z „indeksowania łańcuchowego” (
df['x']['C']
) może powodować problemy.Widzieć:
źródło
ix
jest przestarzałe: pandas-docs.github.io/pandas-docs-travis/…Spróbuj użyć
df.loc[row_index,col_indexer] = value
źródło
To jedyna rzecz, która działała dla mnie!
Dowiedz się więcej o
.loc
tutaj .źródło
.loc
zastąpi.iat/.at
?at
Podobne do tegoloc
, że oba zapewniają wyszukiwania oparte na etykietach. Użyj,at
jeśli potrzebujesz tylko uzyskać lub ustawić pojedynczą wartość w ramce danych lub serii. Z padas doc.iat/.at
jest dobrym rozwiązaniem. Załóżmy, że masz tę prostą ramkę danych:jeśli chcemy zmodyfikować wartość komórki,
[0,"A"]
możemy użyć jednego z tych rozwiązań:df.iat[0,0] = 2
df.at[0,'A'] = 2
A oto kompletny przykład, jak użyć,
iat
aby uzyskać i ustawić wartość komórki:y_train przed:
y_train po wywołaniu funkcji prepossessing,
iat
aby zmienić, aby pomnożyć wartość każdej komórki przez 2:źródło
Aby ustawić wartości, użyj:
set_value
,ix
Były przestarzałe.iloc
iloc
źródło
możesz użyć
.iloc
.źródło
df.iloc[[2:8], [0]] = [2,3,4,5,6,7]
Które metodadf.loc()
natywnie obsługuje.W moim przykładzie po prostu zmieniam to w wybranej komórce
„wynik” to pole danych z kolumną „waga”
źródło
set_value()
jest przestarzałe.Począwszy od wydania 0.23.4, Pandas „ ogłasza przyszłość ” ...
Biorąc pod uwagę tę radę, oto pokaz, jak z nich korzystać:
Bibliografia:
źródło
Oto podsumowanie prawidłowych rozwiązań dostarczonych przez wszystkich użytkowników dla ramek danych indeksowanych według liczb całkowitych i ciągu.
df.iloc, df.loc i df.at działają dla obu typów ramek danych, df.iloc działa tylko z indeksami liczb całkowitych wierszy / kolumn, df.loc i df.at obsługuje ustawianie wartości przy użyciu nazw kolumn i / lub indeksów liczb całkowitych .
Gdy określony indeks nie istnieje, zarówno df.loc, jak i df.at dołączałyby nowo wstawione wiersze / kolumny do istniejącej ramki danych, ale df.iloc spowodowałoby błąd „IndexError: indeksatory pozycyjne są poza zakresem”. Przykład działania przetestowany w Pythonie 2.7 i 3.7 jest następujący:
źródło
Testowałem, a wynik jest
df.set_value
nieco szybszy, ale oficjalna metodadf.at
wygląda na najszybszy nieaktualny sposób na zrobienie tego.Zauważ, że to ustawia wartość dla pojedynczej komórki. Dla wektorów
loc
iiloc
powinny być lepszymi opcjami, ponieważ są wektoryzowane.źródło
Jednym ze sposobów użycia indeksu z warunkiem jest najpierw uzyskanie indeksu wszystkich wierszy spełniających warunek, a następnie po prostu użycie tych indeksów wierszy na wiele sposobów
Przykładowy warunek jest podobny
Następnie możesz użyć tych indeksów wierszy na różne sposoby, np
Jest to możliwe, ponieważ .index zwraca tablicę indeksu, z której .loc może korzystać przy bezpośrednim adresowaniu, dzięki czemu unika ciągłego przechodzenia.
źródło
df.loc['c','x']=10
Spowoduje to zmianę wartości c- tego wiersza i x- tej kolumny.źródło
Oprócz powyższych odpowiedzi, tutaj jest test porównawczy różnych sposobów dodawania wierszy danych do już istniejącej ramki danych. Pokazuje, że użycie wartości at lub set-value jest najbardziej wydajnym sposobem dla dużych ramek danych (przynajmniej w tych warunkach testowych).
Do testu wykorzystano istniejącą ramkę danych zawierającą 100 000 wierszy i 1000 kolumn oraz losowe wartości liczbowe. Do tej ramki danych dodano 100 nowych wierszy.
Kod patrz poniżej:
źródło
Jeśli chcesz zmienić wartości nie dla całego wiersza, ale tylko dla niektórych kolumn:
źródło
Od wersji 0.21.1 możesz także użyć
.at
metody. Istnieją pewne różnice w porównaniu do.loc
wspomnianych tutaj - pandy .at w porównaniu z .loc , ale jest szybsze przy zamianie pojedynczej wartościźródło
Tak, twoje pytanie o konwersję NaN w ['x', C] na wartość 10
odpowiedź to..
alternatywny kod to
źródło
Ja również szukałem tego tematu i opracowałem sposób na iterację w DataFrame i zaktualizowałem go o wartości wyszukiwania z drugiej DataFrame. Oto mój kod.
źródło