Метод pandas read_csv () інтерпретує 'NA' як nan (а не число) замість дійсного рядка.
У наведеному нижче простому випадку зауважте, що в рядку 1, стовпці 2 (кількість, що базується на нулі) виводиться „nan“ замість „NA“.
sample.tsv (розділена табуляцією)
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 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)
Додаткова інформація
Повторне записування файлу з лапками для даних у стовпці «ЛАНЦЮГ», а потім використання параметра quotechar quotechar='\''
має той самий результат. І передача словника типів через параметр dtype dtype=dict(valid_cols)
не змінює результат.
Стара відповідь щодо запобігання автоматичному виведенню пандами типу read_csv пропонує спочатку використовувати масив записів numpy для синтаксичного аналізу файлу, але з огляду на можливість тепер вказувати типи d стовпців, це не повинно бути необхідним.
Зверніть увагу, що itertuples () використовується для збереження dtypes, як описано в документації iterrows: "Щоб зберегти dtypes під час ітерації по рядках, краще використовувати itertuples (), який повертає кортежі значень і який, як правило, швидший, ніж iterrows."
Приклад був протестований на Python 2 і 3 з версіями панд 0.16.2, 0.17.0 та 0.17.1.
Чи є спосіб захопити дійсний рядок 'NA' замість того, щоб перетворити його на nan?