Przykładowa ramka danych:

import pandas as pd
df = pd.DataFrame({'a': [-3, -2, 0], 'b': [-2, 2, 5], 'c': [-1, 0, 7], 'd': [1, 4, 8]})

Próbuję zrobić coś, czego spodziewałbym się, że będziemy dość prosty, a który jest rzeczywiście natychmiastowy w innych językach wspierających klasę Dataframe, takie jak R. Chcę tylko wyodrębnić jedną wartość z df, z Tylko zastrzeżenie, które wybiorę wiersz z wyrażeniem boolowskim (powiedzmy, `" A "== 0), zamiast tego za pomocą etykiety. Kolumna zamiast tego jest wybrana przez etykietę, jak zwykle. Na przykład to działa, ale wydaje się niepotrzebnie marnotrawne:

df["c"][df["a"]==0][1] 

Zamiast bezpośrednio wyodrębnianie wartości z dataframe, ta instrukcja 1) wyodrębnia serii Pandas, 2) wybiera wiersz w serii i 3) wybiera drugi element tablicy zwróconej przez wybór wiersza! (Pierwszym elementem jest indeks). Nie tylko wydaje się niepotrzebnie skomplikowane, ale martwię się, że może być również powolny dla bardzo dużych dataframek.

Próbowałem innych rozwiązań przy użyciu .at lub .iat, ale nic nie działa. Czy nie ma prostszego / mądrzejszego sposobu, aby to zrobić?

1
DeltaIV 28 luty 2019, 02:09

2 odpowiedzi

Najlepsza odpowiedź

Nie możesz tego zrobić w jednym strzale:

In [11]: df.loc[df["a"]==0, "c"]
Out[11]:
2    7
Name: c, dtype: int64

In [12]: df.loc[df["a"]==0, "c"].iat[0]
Out[12]: 7
2
Andy Hayden 27 luty 2019, 23:13

Za pomocą nonzero za pomocą iat

df.iat[(df.a==0).nonzero()[0][0],2]
Out[114]: 7
1
BENY 27 luty 2019, 23:22