2015-11-27 10 views
19

パンダread_csv()メソッドは、有効な文字列ではなく、「NA」をナンバー(数字ではない)として解釈します。パンダが「NA」を文字列のNaNとして解釈しないようにする

以下の簡単なケースでは、行1、列2(ゼロベースのカウント)の出力が「NA」ではなく「nan」であることに注意してください。

sample.tsv(タブ区切り)

PDBチェーンSP_PRIMARY RES_BEG RES_END PDB_BEG PDB_EN​​D SP_BEG SP_END
5d8b N P60490 1 146 1 146 1 146
5d8b NA P80377 1 126 1 126 1 126
5d8b O P60491 1 118 1 118 1 118

read_sample.py

import pandas as pd 

df = pd.read_csv(
    'sample.tsv', 
    sep='\t', 
    encoding='utf-8', 
) 

for df_tuples in df.itertuples(index=True): 
    print(df_tuples) 

出力

(0、u'5d8b 'u'N'、u'P60490' 、1、146、1、146、1、146)
( 1、u'5d8b '、u'5d8b'、u'5d8b '、u'5d8b'、u'5d8b '、u'PD4''1、 1,118,118)

追加のInforma

'CHAIN'列にデータを引用符で置き換えた後、quotecharパラメータquotechar='\''を使用してファイルを書き直すと、同じ結果になります。 dtypeパラメータdtype=dict(valid_cols)で型の辞書を渡しても結果は変わりません。

古い答えはPrevent pandas from automatically inferring type in read_csvです。まずnumpyレコード配列を使用してファイルを解析することを提案しますが、今は列dtypesを指定できるため、これは必要ではありません。

itertuples()は、iterrowsのドキュメントに記載されているように、dtypesを保持するために使用されることに注意してください: "行を反復処理しながらdtypesを保持するには、値のタプルを返すitertuples() iterrowsとして。

例は、Python 2と3で、パンダバージョン0.16.2、0.17.0、および0.17.1でテストされました。


有効な文字列「NA」の代わりに、それはNaNに変換さをキャプチャする方法はありますか?

+0

それはむしろそれが数として扱いだということではないですが、あなたは[データ欠落](http://pandas.pydata.orgを持っていることを示すパラメータを使用してから来ました/pandas-docs/stable/missing_data.html#values-considered-missing)。私はあなたの場合に修正が何であるか分からないが、ちょうどあなたが知っておくべきだと思った。 –

+0

@JeffMercado下記のAntonの例を試しても、 'keep_default_na = False'を取り除くと、NaNは実際には' 'になります。 – binarysubstrate

+0

@binarysubstrate質問を少しだけトリミングすることも考えられます(例えば、「単純なケース」のままにしておきます)。これは、質問をより集中し、他の読者にとってより便利にするでしょう(非常に良い質問です)。 – joris

答えて

18

あなたが手docsにより、すべてのNA値を設定するためのパラメータkeep_default_nana_valuesを使用することができます。na-valuesから

import pandas as pd 
from io import StringIO 

data = """ 
PDB CHAIN SP_PRIMARY RES_BEG RES_END PDB_BEG PDB_END SP_BEG SP_END 
5d8b N P60490 1 146 1 146 1 146 
5d8b NA P80377 _ 126 1 126 1 126 
5d8b O P60491 1 118 1 118 1 118 
""" 

df = pd.read_csv(StringIO(data), sep=' ', keep_default_na=False, na_values=['_']) 

In [130]: df 
Out[130]: 
    PDB CHAIN SP_PRIMARY RES_BEG RES_END PDB_BEG PDB_END SP_BEG SP_END 
0 5d8b  N  P60490  1  146  1  146  1  146 
1 5d8b NA  P80377  NaN  126  1  126  1  126 
2 5d8b  O  P60491  1  118  1  118  1  118 

In [144]: df.CHAIN.apply(type) 
Out[144]: 
0 <class 'str'> 
1 <class 'str'> 
2 <class 'str'> 
Name: CHAIN, dtype: object 

EDIT

すべてデフォルトNA値:

デフォルトのNaNを認識される値は['-1.#IND', '1.#QNAN', '1.#IND', '-1.#QNAN', '#N/A','N/A', 'NA', '#NA', 'NULL', 'NaN', '-NaN', 'nan', '-nan']です。長さ0のストリング ''はデフォルトのNaN値リストには含まれていませんが、それでも欠損値として扱われます。私の解決策については

+0

パーフェクト、ありがとう。 – binarysubstrate

6

na_filter = False

df = pd.read_csv(file_, header=0, dtype=object, na_filter = False) 
関連する問題