2017-02-20 8 views
0

私はピアソン係数を取得しようとする大きなデータフレームのパンダを持っています。いくつかの列には文字列が含まれることがありますが、文字列を含むデータフレームのすべての列を削除したいと考えています。 私のコードは現在、エラーは発生していませんが、動作していません。データフレーム内の文字列を含むすべての列を削除します

def StringNoMore(dataframe): 
    i=len(dataframe.index)-1 
    print(i) 
    while i > 0: 
     for cell in dataframe.iloc[i]: 
      dataframe=dataframe.loc[:, (dataframe != str).any(axis=0)] 
     print(i) 
     i-=1 
    print("dataframe no string") 
    return dataframe 
+0

データフレームは文字列ではないので、 'dataframe!= str'は常に' Tru'です。 – DyZ

答えて

2

1つの方法は、列を数値型に変換することです。 floatまたはint。あなたは、数値の列にそれぞれの値を変換できない場合、あなたはそれがstrが含まれています知っている:

import pandas as pd 

df = pd.DataFrame({'A': [1, 'abc', 'def', 3], 'B': [2, 2, 1, 4], 'C': ['a', 'a', 'b', 3]}) 

cols_to_remove = [] 

for col in df.columns: 
    try: 
     _ = df[col].astype(float) 
    except ValueError: 
     print('Couldn\'t covert %s to float' % col) 
     cols_to_remove.append(col) 
     pass 

# keep only the columns in df that do not contain string 
df = df[[col for col in df.columns if col not in cols_to_remove]] 

結果:

>>> df 
    B 
0 2 
1 2 
2 1 
3 4 
+0

ありがとうそれはうまくいっていて、本当に速いです。 –

+0

*非常に*大きなdfの場合、リストではなく、 'cols_to_remove'をセットにしてください。 – BallpointBen

1

あなたのデータフレームは、数字、ブール値、文字列のみを持っている場合は、次のコードが動作します:

df = df[df.T[df.dtypes!=np.object].index] 
+0

私は問題をコード化するのを避けるために、ある時点で私の全データフレームを書いていると思います。@not_a_robotの解決策は素早く動いていますので、私はそれに固執します。 –

関連する問題