Pandas erkennen einen Wert als null, wenn es sich um ein np.nan
Objekt handelt, das wie NaN
im DataFrame gedruckt wird. Ihre fehlenden Werte sind wahrscheinlich leere Zeichenfolgen, die Pandas nicht als null erkennt. Um dies zu beheben, können Sie die leeren Stiche (oder was auch immer sich in Ihren leeren Zellen befindet) np.nan
mithilfe von Objekten in Objekte konvertieren replace()
und dann dropna()
Ihren DataFrame aufrufen, um Zeilen mit null Mandanten zu löschen.
Zur Demonstration erstellen wir einen DataFrame mit einigen zufälligen Werten und einigen leeren Zeichenfolgen in einer Tenants
Spalte:
>>> import pandas as pd
>>> import numpy as np
>>>
>>> df = pd.DataFrame(np.random.randn(10, 2), columns=list('AB'))
>>> df['Tenant'] = np.random.choice(['Babar', 'Rataxes', ''], 10)
>>> print df
A B Tenant
0 -0.588412 -1.179306 Babar
1 -0.008562 0.725239
2 0.282146 0.421721 Rataxes
3 0.627611 -0.661126 Babar
4 0.805304 -0.834214
5 -0.514568 1.890647 Babar
6 -1.188436 0.294792 Rataxes
7 1.471766 -0.267807 Babar
8 -1.730745 1.358165 Rataxes
9 0.066946 0.375640
Jetzt ersetzen wir alle leeren Zeichenfolgen in der Tenants
Spalte durch np.nan
Objekte wie folgt:
>>> df['Tenant'].replace('', np.nan, inplace=True)
>>> print df
A B Tenant
0 -0.588412 -1.179306 Babar
1 -0.008562 0.725239 NaN
2 0.282146 0.421721 Rataxes
3 0.627611 -0.661126 Babar
4 0.805304 -0.834214 NaN
5 -0.514568 1.890647 Babar
6 -1.188436 0.294792 Rataxes
7 1.471766 -0.267807 Babar
8 -1.730745 1.358165 Rataxes
9 0.066946 0.375640 NaN
Jetzt können wir die Nullwerte löschen:
>>> df.dropna(subset=['Tenant'], inplace=True)
>>> print df
A B Tenant
0 -0.588412 -1.179306 Babar
2 0.282146 0.421721 Rataxes
3 0.627611 -0.661126 Babar
5 -0.514568 1.890647 Babar
6 -1.188436 0.294792 Rataxes
7 1.471766 -0.267807 Babar
8 -1.730745 1.358165 Rataxes
np.nan
wenn du kannstpd.np.nan
?df[df['Tenant'].astype(bool)]
(vorausgesetzt, keine Leerzeichen - nur leere Zeichenfolge) schneller ist alsdf.replace('', np.nan).dropna(subset=['Tenant'])
Pythonic + Pandorable:
df[df['col'].astype(bool)]
Leere Zeichenfolgen sind falsch, was bedeutet, dass Sie nach folgenden Bool-Werten filtern können:
df = pd.DataFrame({ 'A': range(5), 'B': ['foo', '', 'bar', '', 'xyz'] }) df A B 0 0 foo 1 1 2 2 bar 3 3 4 4 xyz
df['B'].astype(bool) 0 True 1 False 2 True 3 False 4 True Name: B, dtype: bool df[df['B'].astype(bool)] A B 0 0 foo 2 2 bar 4 4 xyz
Wenn Sie nicht nur leere Zeichenfolgen entfernen möchten, sondern auch Zeichenfolgen, die nur Leerzeichen enthalten, verwenden Sie
str.strip
Folgendes:df[df['B'].str.strip().astype(bool)] A B 0 0 foo 2 2 bar 4 4 xyz
Schneller als du denkst
.astype
ist eine vektorisierte Operation, dies ist schneller als jede bisher vorgestellte Option. Zumindest aus meinen Tests. YMMV.Hier ist ein Zeitvergleich, den ich in einige andere Methoden geworfen habe, die mir einfallen könnten.
Benchmarking-Code als Referenz:
import pandas as pd import perfplot df1 = pd.DataFrame({ 'A': range(5), 'B': ['foo', '', 'bar', '', 'xyz'] }) perfplot.show( setup=lambda n: pd.concat([df1] * n, ignore_index=True), kernels=[ lambda df: df[df['B'].astype(bool)], lambda df: df[df['B'] != ''], lambda df: df[df['B'].replace('', np.nan).notna()], # optimized 1-col lambda df: df.replace({'B': {'': np.nan}}).dropna(subset=['B']), ], labels=['astype', "!= ''", "replace + notna", "replace + dropna", ], n_range=[2**k for k in range(1, 15)], xlabel='N', logx=True, logy=True, equality_check=pd.DataFrame.equals)
quelle
value_counts lässt NaN standardmäßig weg, sodass Sie höchstwahrscheinlich mit "" zu tun haben.
Sie können sie also einfach wie herausfiltern
filter = df["Tenant"] != "" dfNew = df[filter]
quelle
Es gibt eine Situation, in der die Zelle einen Leerraum hat, den Sie nicht sehen können
df['col'].replace(' ', np.nan, inplace=True)
um dann Leerzeichen als NaN zu ersetzen
df= df.dropna(subset=['col'])
quelle
Sie können diese Variante verwenden:
import pandas as pd vals = { 'name' : ['n1', 'n2', 'n3', 'n4', 'n5', 'n6', 'n7'], 'gender' : ['m', 'f', 'f', 'f', 'f', 'c', 'c'], 'age' : [39, 12, 27, 13, 36, 29, 10], 'education' : ['ma', None, 'school', None, 'ba', None, None] } df_vals = pd.DataFrame(vals) #converting dict to dataframe
Dies wird ausgegeben (** - nur gewünschte Zeilen hervorheben):
age education gender name 0 39 ma m n1 ** 1 12 None f n2 2 27 school f n3 ** 3 13 None f n4 4 36 ba f n5 ** 5 29 None c n6 6 10 None c n7
Verwenden Sie den folgenden Code, um alles zu löschen, was keinen Bildungswert hat:
df_vals = df_vals[~df_vals['education'].isnull()]
('~' bedeutet NICHT)
Ergebnis:
age education gender name 0 39 ma m n1 2 27 school f n3 4 36 ba f n5
quelle