[解決済み] pandasが文字列中の'NA'をNaNと解釈しないようにする。
質問
パンダ 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_na
と
na_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', ''] となります。
関連
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] PandasでDataFrameの行を反復処理する方法
-
[解決済み] バイトを文字列に変換する
-
[解決済み] 割り当て後にリストが予期せず変更されました。その理由と防止策を教えてください。
-
[解決済み] 列の値に基づいてDataFrameから行を選択するにはどうすればよいですか?
-
[解決済み] Pandasのカラム名のリネーム
-
[解決済み] Pandas DataFrameからカラムを削除する
-
[解決済み] Pandas DataFrameの特定の列の値がNaNである行を削除する方法
-
[解決済み】文字列をdatetimeに変換する
-
[解決済み】Pandas DataFrameのカラムヘッダからリストを取得する。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] PythonでのAWS Lambdaのインポートモジュールエラー
-
[解決済み] PythonでファイルのMD5チェックサムを計算するには?重複
-
[解決済み] Pythonの構文に新しいステートメントを追加することはできますか?
-
[解決済み] Spyderを仮想環境で動作させるには?
-
[解決済み] タプルのリストを複数のリストに変換するには?
-
[解決済み] DataFrameに日付間の日数カラムを追加する pandas
-
[解決済み] あるオブジェクトが数であるかどうかを確認する、最もパイソン的な方法は何でしょうか?
-
[解決済み] PyQtアプリケーションのスレッド化。QtスレッドとPythonスレッドのどちらを使うか?
-
[解決済み] pycharmがタブをスペースに自動変換する
-
[解決済み] Python 言語を決定するには?