2015-11-27 13 views
11

Es gibt einen Datenrahmen wie folgt aus, und es hat einen unreinen Spalte ‚id‘, die sholud es numerische SpalteEntfernen nicht-numerischen Reihen in einer Spalte mit Pandas

id, name 
1, A 
2, B 
3, C 
tt, D 
4, E 
5, F 
de, G 

Gibt es eine prägnante Art und Weise zu entfernen die Zeilen, weil tt und de keine numerischen Werte sind

um den Datenrahmen sauber zu machen? Bei

id, name 
1, A 
2, B 
3, C 
4, E 
5, F 

Antwort

10

könnten Sie verwenden Standard-Methode von Strings isnumeric und es auf jeden Wert in Ihrer id Spalte:

import pandas as pd 
from io import StringIO 

data = """ 
id,name 
1,A 
2,B 
3,C 
tt,D 
4,E 
5,F 
de,G 
""" 

df = pd.read_csv(StringIO(data)) 

In [55]: df 
Out[55]: 
    id name 
0 1 A 
1 2 B 
2 3 C 
3 tt D 
4 4 E 
5 5 F 
6 de G 

In [56]: df[df.id.apply(lambda x: x.isnumeric())] 
Out[56]: 
    id name 
0 1 A 
1 2 B 
2 3 C 
4 4 E 
5 5 F 

Oder wenn Sie id als Index verwenden möchten Sie tun können:

In [61]: df[df.id.apply(lambda x: x.isnumeric())].set_index('id') 
Out[61]: 
    name 
id  
1  A 
2  B 
3  C 
4  E 
5  F 
3

dass df ist Ihr Datenrahmen,

import numpy as np 
df[df['id'].apply(lambda x: isinstance(x, (int, np.int64)))] 

Was sie tut, ist jeder Wert in der id Spalte in die isinstance Funktion und Kontrollen vorbei, wenn er einen int ist. Dann gibt es ein boolesches Array zurück und gibt schließlich nur die Zeilen zurück, in denen True steht.

Wenn Sie auch für float Werte berücksichtigen müssen, eine weitere Option:

import numpy as np 
df[df['id'].apply(lambda x: type(x) in [int, np.int64, float, np.float64])] 

Beachten Sie, dass so oder so nicht Inplace ist, so dass Sie es zu Ihrem ursprünglichen df neu zuweisen müssen, oder eine neue erstellen :

df = df[df['id'].apply(lambda x: type(x) in [int, np.int64, float, np.float64])] 
# or 
new_df = df[df['id'].apply(lambda x: type(x) in [int, np.int64, float, np.float64])] 
12

Mit pd.to_numeric

In [1079]: df[pd.to_numeric(df['id'], errors='coerce').notnull()] 
Out[1079]: 
    id name 
0 1  A 
1 2  B 
2 3  C 
4 4  E 
5 5  F 
+0

das ist der Trick – TonyTony

+0

Wenn Sie die Spalte als Nummer behalten wollen und nicht ein Objekt, müssen Sie möglicherweise 'pd.to_numeric' separat aufrufen. –

+0

Kein 'apply': D! – josh

Verwandte Themen