2017-10-19 15 views
1

J'ai un dataframe en pandas géants où l'une des colonnes (c.-à-colonne « b ») contient des chaînes avec des symboles $:comment filtrer les lignes en fonction de

import numpy as np 
import pandas as pd 

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

Je veux filtrer la trame de données tel que je ne retenez que les lignes où column'b 'ne renvoie que des entiers autres que zéro et le symbole $ est ignoré.

Ma sortie désirée est:

enter image description here

Tous les commentaires sont les bienvenus.

Répondre

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 

Sinon, nous pouvons filtrer cette façon:

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

De même, en utilisant pd.to_numeric (en supposant que vos données ont cette même structure tout au long).

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 

Si vous souhaitez filtrer les deux NaN s et des zéros, utilisez:

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