To wydaje się śmieszne pytanie ... ale nie widzę łatwej odpowiedzi, której się spodziewałem.
Jak więc uzyskać wartość w n-tym wierszu danej kolumny w Pandach? (Jestem szczególnie zainteresowany pierwszym rzędem, ale chciałbym również bardziej ogólnej praktyki).
Załóżmy na przykład, że chcę pobrać wartość 1,2 w Btime jako zmienną.
Jak to zrobić?
df_test =
ATime X Y Z Btime C D E
0 1.2 2 15 2 1.2 12 25 12
1 1.4 3 12 1 1.3 13 22 11
2 1.5 1 10 6 1.4 11 20 16
3 1.6 2 9 10 1.7 12 29 12
4 1.9 1 1 9 1.9 11 21 19
5 2.0 0 0 0 2.0 8 10 11
6 2.4 0 0 0 2.4 10 12 15
df_test.head(1)
działał, bardziej ogólną formą jest użycieiloc
odpowiedzi udzielonej przez unutbu1.2
? lub Seria o długości 1, którą otrzymaszdf_test.head(1)
, która również będzie zawierała indeks? Aby uzyskać tylko wartość, wykonajdf_test.head(1).item()
, atolist()
następnie pokrój.Odpowiedzi:
Aby wybrać
ith
wiersz, użyjiloc
:Aby wybrać i -tą wartość w
Btime
kolumnie, możesz użyć:Istnieje różnica między
df_test['Btime'].iloc[0]
(zalecanym) adf_test.iloc[0]['Btime']
:DataFrames przechowują dane w blokach opartych na kolumnach (gdzie każdy blok ma jeden typ). Jeśli wybierzesz najpierw według kolumny, widok może zostać zwrócony (co jest szybsze niż zwrot kopii), a oryginalny typ zostanie zachowany. W przeciwieństwie do tego, jeśli najpierw wybierzesz według wiersza, a ramka danych ma kolumny różnych typów, wówczas Panda kopiuje dane do nowej serii obiektów typu. Tak więc wybieranie kolumn jest nieco szybsze niż wybieranie wierszy. Tak więc, chociaż
df_test.iloc[0]['Btime']
działa,df_test['Btime'].iloc[0]
jest nieco bardziej wydajny.Istnieje duża różnica między nimi, jeśli chodzi o przypisanie.
df_test['Btime'].iloc[0] = x
wpływadf_test
, aledf_test.iloc[0]['Btime']
może nie. Poniżej wyjaśniono, dlaczego. Ponieważ subtelna różnica w kolejności indeksowania powoduje dużą różnicę w zachowaniu, lepiej jest użyć pojedynczego przypisania indeksowania:df.iloc[0, df.columns.get_loc('Btime')] = x
(Zalecana):Zalecany sposób , aby przypisać nowe wartości do DataFrame jest uniknąć przykuty indeksowanie , a zamiast tego zastosować metodę przedstawioną przez Andrzeja ,
lub
Ta ostatnia metoda jest nieco szybsza, ponieważ
df.loc
musi przekonwertować etykiety wierszy i kolumn na indeksy pozycyjne, więc w przypadku użyciadf.iloc
zamiast niej konieczna jest nieco mniejsza konwersja .df['Btime'].iloc[0] = x
działa, ale nie jest zalecane:Chociaż to działa, wykorzystuje sposób, w jaki DataFrames są obecnie implementowane. Nie ma gwarancji, że Pandy będą musiały działać w ten sposób w przyszłości. W szczególności wykorzystuje fakt, że (obecnie)
df['Btime']
zawsze zwraca widok (a nie kopię), więcdf['Btime'].iloc[n] = x
można go użyć do przypisania nowej wartości w n-tym miejscuBtime
kolumnydf
.Ponieważ Pandas nie daje wyraźnych gwarancji, kiedy indeksujący zwracają widok w porównaniu z kopią, przypisania, które używają indeksowania łańcuchowego, generalnie zawsze podnoszą wartość,
SettingWithCopyWarning
nawet jeśli w tym przypadku przypisanie udaje się zmodyfikowaćdf
:df.iloc[0]['Btime'] = x
nie działa:Natomiast przypisanie z
df.iloc[0]['bar'] = 123
nie działa, ponieważdf.iloc[0]
zwraca kopię:Ostrzeżenie : wcześniej zasugerowałem
df_test.ix[i, 'Btime']
. Nie gwarantuje to jednakith
wartości, ponieważix
próbuje zaindeksować według etykiety przed próbą indeksowania według pozycji . Więc jeśli DataFrame ma indeks liczb całkowitych, który nie jest posortowany od 0, wówczas użycieix[i]
zwróci wiersz oznaczonyi
zamiastith
wiersza. Na przykład,źródło
df_test.iloc[0]['Btime']
działa,df_test.iloc['Btime'][0]
jest nieco bardziej wydajny.df['Btime'].iloc[0]
preferowanydf['Btime'].values[0]
? z dokumentacji wynika, że „Ostrzeżenie: zalecamy użycie Series.array lub Series.to_numpy (), w zależności od tego, czy potrzebujesz odwołania do danych bazowych, czy tablicy NumPy”. ale nie jestem pewien, co to znaczyPamiętaj, że odpowiedź @unutbu będzie poprawna, dopóki nie chcesz ustawić wartości na coś nowego, wtedy nie będzie działać, jeśli twoja ramka danych jest widokiem.
Innym podejściem, które będzie konsekwentnie działać zarówno przy ustawianiu, jak i pobieraniu, jest:
źródło
Inny sposób to zrobić:
Ten sposób wydaje się być szybszy niż użycie
.iloc
:źródło
df.iloc[0].head(1)
- Pierwszy zestaw danych tylko z całego pierwszego wiersza.df.iloc[0]
- Cały pierwszy rząd w kolumnie.źródło
W sposób ogólny, jeśli chcesz odebrać pierwszych N wierszy z kolumny J z
pandas dataframe
najlepszym sposobem aby to zrobić jest:źródło
Aby uzyskać np. Wartość z kolumny „test” i wiersza 1, działa tak
ponieważ
df[['test']].values[0]
zwraca tylko tablicęźródło
Innym sposobem uzyskania pierwszego wiersza i zachowania indeksu:
źródło