1. ホーム
  2. python

[解決済み] pandasが文字列中の'NA'をNaNと解釈しないようにする。

2022-12-03 19:10:22

質問

パンダ read_csv() メソッドは'NA'を有効な文字列ではなく、ナン(数字ではない)として解釈します。

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

サンプル.tsv (タブ区切り)

<ブロッククオート

pdbチェーン 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 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', nan, u'P80377', 1, 126, 1, 126, 1, 126)

(2, u'5d8b', u'O', u'P60491', 1, 118, 1, 118, 1, 118)

追加情報

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

に対する古い回答 read_csvでpandasが自動的に型を推論しないようにする。 は、最初にファイルをパースするためにnumpyレコード配列を使用することを提案していますが、現在、列のdtypesを指定する機能を考えると、これは必要ないはずです。

iterrowsのドキュメントで説明されているように、itertuples()がdtypesを保持するために使用されていることに注意してください。

この例は、Python 2と3、pandasバージョン0.16.2、0.17.0、0.17.1でテストされています。


有効な文字列'NA'をnanに変換するのではなく、キャプチャする方法はありますか?

どのように解決するのですか?

パラメータを使用することができます。 keep_default_nana_values で全ての NA 値を手動で設定する ドキュメント :

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 の値は Na-values (の時点では pandas 1.0.0):

デフォルトのNaN認識値は ['-1.#IND', '1.#QNAN', '1.#IND', '-1.#QNAN', '#N/A N', '#N/A', 'n/a', 'NA', '', '#NA', 'NULL', 'null', 'NaN', '-NaN', 'nan', '-nan', ''] となります。