Mam to DataFrame
i chcę tylko rekordy, których EPS
kolumna nie jest NaN
:
>>> df
STK_ID EPS cash
STK_ID RPT_Date
601166 20111231 601166 NaN NaN
600036 20111231 600036 NaN 12
600016 20111231 600016 4.3 NaN
601009 20111231 601009 NaN NaN
601939 20111231 601939 2.5 NaN
000001 20111231 000001 NaN NaN
... czyli coś w rodzaju df.drop(....)
uzyskania tej wynikowej ramki danych:
STK_ID EPS cash
STK_ID RPT_Date
600016 20111231 600016 4.3 NaN
601939 20111231 601939 2.5 NaN
Jak mogę to zrobić?
df.dropna(subset = ['column1_name', 'column2_name', 'column3_name'])
Odpowiedzi:
Nie upuszczaj, po prostu weź wiersze, w których EPS nie jest NA:
źródło
pandas.notnull
zamiastnp.isfinite
EPS
w tym przykładzie) zawiera ciągi znaków lub inne typy, których nie można przetrawićnp.isfinite()
. Polecam użyćpandas.notnull()
, które poradzi sobie z tym hojniej.To pytanie zostało już rozwiązane, ale ...
... rozważ także rozwiązanie zaproponowane przez Woutera w jego oryginalnym komentarzu . Możliwość obsługi brakujących danych, w tym
dropna()
, jest wbudowana w pandy jawnie. Oprócz potencjalnie lepszej wydajności niż robienie tego ręcznie, funkcje te zawierają również szereg opcji, które mogą być przydatne.Istnieją również inne opcje (patrz dokumenty na http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.html ), w tym usuwanie kolumn zamiast wierszy.
Bardzo przydatne!
źródło
df.dropna(subset = ['column_name'])
. Mam nadzieję, że zaoszczędzi przynajmniej jednej osobie dodatkowe 5 sekund „co robię źle”. Świetna odpowiedź, +1df.dropna(subset = ['column_name'])
jest dokładnie tym, czego szukałem! Dzięki!Wiem, że już na nie odpowiedziano, ale tylko ze względu na czysto pandowe rozwiązanie tego konkretnego pytania, w przeciwieństwie do ogólnego opisu Amana (który był cudowny) i na wypadek, gdyby ktokolwiek zdarzył się na to:
źródło
df.dropna(subset=['EPS'])
(w oparciu o ogólny opis Amana, oczywiście to również działa)notnull
jest również tym, co Wes (autor Pandas) zasugerował w swoim komentarzu do innej odpowiedzi.df[pd.notnull(df[df.columns[INDEX]])]
gdzieINDEX
byłaby kolumna numerowana, jeśli nie znasz nazwyMożesz użyć tego:
źródło
how='all'
tutaj jest zbędne, ponieważ podzbiorów dataframe tylko z jednej dziedzinie, tak jak'all'
i'any'
będzie miał ten sam efekt.Najprostsze ze wszystkich rozwiązań:
źródło
Możesz użyć metody dataframe notnull lub inverse of isnull lub numpy.isnan :
źródło
Prosty i łatwy sposób
df.dropna(subset=['EPS'],inplace=True)
źródło: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.html
źródło
inplace=True
jest dziwnym tematem i nie ma na nie wpływuDataFrame.dropna()
. Zobacz: github.com/pandas-dev/pandas/issues/16529jeszcze inne rozwiązanie, które wykorzystuje fakt, że
np.nan != np.nan
:źródło
Inna wersja:
źródło
Series.notna()
?W zestawach danych o dużej liczbie kolumn jeszcze lepiej jest zobaczyć, ile kolumn zawiera wartości null, a ile nie.
Na przykład w mojej ramce danych zawierał 82 kolumny, z których 19 zawierało co najmniej jedną wartość null.
Ponadto możesz również automatycznie usuwać kolumny i wiersze w zależności od tego, która ma więcej wartości zerowych.
Oto kod, który robi to inteligentnie:
Uwaga: powyższy kod usuwa wszystkie wartości zerowe. Jeśli chcesz mieć wartości zerowe, przetworz je wcześniej.
źródło
Można dodać, że „&” może być użyte do dodania dodatkowych warunków, np
Zauważ, że podczas oceny instrukcji pandy potrzebują nawiasów.
źródło
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
. Musisz dodać nawias -df = df[(df.EPS > 2.0) & (df.EPS <4.0)]
ale także nie jest to odpowiedź na to pytanie.Z jakiegoś powodu żadna z wcześniej przesłanych odpowiedzi nie działała dla mnie. To podstawowe rozwiązanie:
Chociaż oczywiście spowoduje to również upuszczenie wierszy z liczbami ujemnymi. Więc jeśli chcesz tych, prawdopodobnie warto też dodać to później.
źródło
Jednym z rozwiązań może być
Innym sposobem może być
Mam nadzieję, że są one przydatne.
źródło