2017-10-19 4 views
1

ich einen Datenrahmen in Pandas haben, wo einer der Spalte (dh Spalte b) Strings mit $ Symbole enthält:wie filtern Zeilen basierend auf

import numpy as np 
import pandas as pd 

df = pd.DataFrame({'a': [51, 2,32,99,81], 'b': ['$3', '$4','$-','$0','$23']}) 

ich die Datenrahmen so filtern möchten, dass ich Behalte nur die Zeilen bei, in denen die Spalte 'b' nur ganze Zahlen ungleich Null zurückgibt und das $ -Symbol verworfen wird.

Meine gewünschte Ausgabe ist:

enter image description here

Jedes Feedback ist willkommen.

Antwort

6
In [64]: df = pd.DataFrame({'a': [51, 2,32,99,81], 'b': ['$3', '$4','$-','$0','$23']}) 

In [65]: df['b'] = pd.to_numeric(df['b'].str.replace(r'\D+', ''), errors='coerce') 

In [67]: df 
Out[67]: 
    a  b 
0 51 3.0 
1 2 4.0 
2 32 NaN 
3 99 0.0 
4 81 23.0 

In [68]: df = df[df['b'].notnull() & df['b'].ne(0)] 

In [69]: df 
Out[69]: 
    a  b 
0 51 3.0 
1 2 4.0 
4 81 23.0 

alternativ können wir es auf diese Weise filtern:

In [73]: df = df.query("b == b and b != 0") 

In [74]: df 
Out[74]: 
    a  b 
0 51 3.0 
1 2 4.0 
4 81 23.0 
4

In ähnlicher Weise unter Verwendung von pd.to_numeric (vorausgesetzt, Ihre Daten, die diese gleiche Struktur hat durch uns).

df.b = pd.to_numeric(df.b.str[1:], errors='coerce') 
print(df) 
    a  b 
0 51 3.0 
1 2 4.0 
2 32 NaN 
3 99 0.0 
4 81 23.0 

print (df.dropna(subset=['b'])) 
    a  b 
0 51 3.0 
1 2 4.0 
3 99 0.0 
4 81 23.0 

Wenn Sie beide NaN s und Nullen, um herauszufiltern, verwenden:

print (df[df.b.notnull() & df.b.ne(0)]) 
    a  b 
0 51 3.0 
1 2 4.0 
4 81 23.0 
4
df.b=pd.to_numeric(df['b'].str.replace('$', ''),errors='coerce') 
df 
Out[603]: 
    a  b 
0 51 3.0 
1 2 4.0 
2 32 NaN 
3 99 0.0 
4 81 23.0 

df.loc[(df.b.notnull())&(df.b!=0),:] 
Out[604]: 
    a  b 
0 51 3.0 
1 2 4.0 
4 81 23.0 
Verwandte Themen