2016-10-01 10 views
2

私はしばらくの間これに固執しており、グーグルの量は役に立たないようです。パンダのデータフレームの多くの列を変更する

私は多くの生データを読み込んでいます。いくつかの変数は、ソースが原因で様々な理由で文字を使用するため、オブジェクトとして表示されます(私は気にしません)。

だから私はちょうど(再び、私は彼らが数値だけのことを、そのあまり気にしないintやfloatとしてキャストするためにこれらを強制的にpandas.to_numeric(___ ,error='coerce')を通じて列のかなり大規模なサブセットを実行したい。

私はこれは簡単に列毎に発生することができます:

df['col_name'] = pd.to_numeric(df['col_name'], errors='coerce') 

をしかし、私は..私はこのようにキャストしたいいくつかの60個の列を持っているので、私はこれが働くだろうと思った:

numeric = ['lots', 'a', 'columns'] 
for item in numeric: 
    df_[item] = pd.to_numeric(df[item], errors='coerce') 

私が得るエラーは:

Traceback (most recent call last): 

File "/Users/____/anaconda/lib/python2.7/site-packages/IPython/core/interactiveshell.py", line 2885, in run_code 
exec(code_obj, self.user_global_ns, self.user_ns) 

File "<ipython-input-53-43b873fbd712>", line 2, in <module> 
df_detail[item] = pd.to_numeric(dfl[item], errors='coerce') 

File "/Users/____/anaconda/lib/python2.7/site-packages/pandas/tools/util.py", line 101, in to_numeric 
raise TypeError('arg must be a list, tuple, 1-d array, or Series') 

TypeError: arg must be a list, tuple, 1-d array, or Series 

私は多くのバージョンを試しました。これは、リストと関係があるか、それを見ているものです。 forループが単に呼び出すときに同じエラーが発生するdf(item).describe()

私の(まだ初心者の)Pythonの理解から、これはうまくいくはずです。私は迷っている。 おかげ

すべての
+0

は([ 'applymap']を見てくださいHTTP考えてみましょう://pandas.py data.org/pandas-docs/stable/generated/pandas.DataFrame.applymap.html)、意味のある戻り値を返すようにしてください(つまり、変換できなかった場合は元の値を戻してください)。 – Jan

答えて

1

まず、参照this answer

# Let 
numeric = ['lots', 'a', 'columns'] 

オプション1

df[numeric] = df[numeric].apply(pd.to_numeric, errors='coerce') 

オプション2

df.loc[:, numeric] = pd.to_numeric(df[numeric].values.ravel(), 'coerce') \ 
         .reshape(-1, len(numeric)) 

デモンストレーション
は、データフレームdf

df = pd.DataFrame([ 
     [1, 'a', 2], 
     ['b', 3, 'c'], 
     ['4', 'd', '5'] 
    ], columns=['A', 'B', 'C']) 

その後両方オプション歩留まり上記

enter image description here

関連する問題