14

data という pandas データフレームがあり、任意の列に文字列を含むすべての行を削除したいと考えています。たとえば、以下では、「gdp」列のインデックス 3 に文字列があり、インデックス 1 に「cap」があることがわかります。

data =

    y  gdp  cap
0   1    2    5
1   2    3    ab
2   8    7    2
3   3    bc   7
4   6    7    7
5   4    8    3
...

exp_list に何が含まれているか事前にわからないため、このスクリプトのようなものを使用しようとしています。残念ながら、「data.var_name」は次のエラーをスローします:「DataFrame」オブジェクトには属性「var_name」がありません。また、文字列が事前にどうなるかわからないので、それを一般化する方法はありますか?

exp_list = ['gdp', 'cap']

for var_name in exp_list:
    data = data[data.var_name != 'ab']
4

2 に答える 2

13

DataFrame文字列の存在を行ごとにテストする関数を適用できますdfDataFrame

 rows_with_strings  = df.apply(
       lambda row : 
          any([ isinstance(e, basestring) for e in row ])
       , axis=1) 

これにより、DataFrame のマスクが生成され、どの行に少なくとも 1 つの文字列が含まれているかが示されます。したがって、反対のマスクを使用して文字列のない行を選択できます

 df_with_no_strings = df[~rows_with_strings]

.

例:

 a = [[1,2],['a',2], [3,4], [7,'d']]
 df = pd.DataFrame(a,columns = ['a','b'])


 df 
   a  b
0  1  2
1  a  2
2  3  4
3  7  d

select  = df.apply(lambda r : any([isinstance(e, basestring) for e in r  ]),axis=1) 

df[~select]                                                                                                                                

    a  b
 0  1  2
 2  3  4
于 2013-11-08T14:34:17.597 に答える