prosource

판다가 문자열에서 'NA'를 NaN으로 해석하지 못하도록 합니다.

probook 2023. 7. 22. 10:12
반응형

판다가 문자열에서 'NA'를 NaN으로 해석하지 못하도록 합니다.

pandas read_csv() 메서드는 'NA'를 유효한 문자열이 아닌 nan(숫자가 아님)으로 해석합니다.

아래의 간단한 경우, 1열 2열(0 기반 카운트)의 출력은 'NA'가 아닌 'nan'입니다.

sample.tsv(탭 구분)

PDB 체인 SP_1차 RES_BEG RES_END PDB_BEG PDB_END SP_BEG SP_END
5d8b NP60490 1 1461 146
5d8b NA P80377 1 126 1 126
5d8b OP60491 1181 1181 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)

추가 정보

'CHANK' 열에 있는 데이터에 대한 따옴표를 사용하여 파일을 다시 작성한 다음 따옴표 매개 변수 사용quotechar='\''결과가 같습니다.그리고 dtype 매개 변수를 통해 유형 사전 전달dtype=dict(valid_cols)결과는 변경되지 않습니다.

read_csv에서 판다가 자동으로 유형을 유추하지 못하도록 방지하는 기존의 답변은 먼저 numpy 레코드 배열을 사용하여 파일을 구문 분석하는 것을 제안하지만, 이제 열 dtype을 지정할 수 있는 기능을 고려할 때 이는 필요하지 않습니다.

itertuples()는 반복 행 문서에 설명된 대로 보존된 형식을 사용합니다. "행을 반복하는 동안 보존된 형식을 사용하려면 값의 튜플을 반환하고 일반적으로 행에 따라 더 빠른 형식을 사용하는 것이 좋습니다."

예제는 Python 2 및 3에서 판다 버전 0.16.2, 0.17.0 및 0.17.1로 테스트되었습니다.


nan으로 변환되지 않고 유효한 문자열 'NA'를 캡처할 수 있는 방법이 있습니까?

매개 변수를 사용할 수 있습니다.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

편집

모두 기본값NAna-값의 값(기준)pandas1.0.0):

기본 NaN 인식 값은 [-1]입니다.#IND', '1.#QNAN', '1.#IND', '-1.#QNAN', '#N/A N/A', '#N/A', 'N/a', 'NA', '#NA', 'NULL', 'NaN', '-Nan', '-nan', '.', '.

나에게 솔루션은 매개 변수를 사용하는 것에서 비롯되었습니다.na_filter = False

df = pd.read_csv(file_, header=0, dtype=object, na_filter = False)

설정keep_default_na매개 변수가 효과를 발휘합니다.

다음은 보관의 예입니다.NAPanda를 사용하여 CSV 파일을 읽는 동안 문자열 값으로 사용됩니다.

data.csv:

country_name,country_code
Mexico,MX
Namibia,NA

read_data.py:

import pandas as pd
data = pd.read_csv("data.csv", keep_default_na=False)
print(data.describe())
print(data)

출력:

       country_name country_code
count             2            2
unique            2            2
top         Namibia           MX
freq              1            1

  country_name country_code
0       Mexico           MX
1      Namibia           NA

참조:

이 접근 방식은 다음과 같습니다.

import pandas as pd
df = pd.read_csv('Test.csv')
co1 col2  col3  col4

a   b    c  d   e
NaN NaN NaN NaN NaN
2   3   4   5   NaN

값을 복사하여 기본적으로 NaN으로 해석되는 목록을 만든 후 NaN이 아닌 것으로 해석되기를 원했던 NA를 코멘트 아웃합니다.이 접근 방식은 여전히 NA를 제외한 다른 값을 NaN으로 처리합니다.

 na_values = ["", 
             "#N/A", 
             "#N/A N/A", 
             "#NA", 
             "-1.#IND", 
             "-1.#QNAN", 
             "-NaN", 
             "-nan", 
             "1.#IND", 
             "1.#QNAN", 
             "<NA>", 
             "N/A", 
#              "NA", 
             "NULL", 
             "NaN", 
             "n/a", 
             "nan", 
             "null"]

df1 = pd.read_csv('Test.csv',na_values=na_values,keep_default_na=False )

      co1  col2  col3  col4
a     b     c     d     e
NaN  NA   NaN    NA   NaN
2     3     4     5   NaN

Anton Protopopov답변바탕으로 기본값을 최소화하는 깔끔한 방법(즉, NaN으로 구문 분석하지 않을 값을 제거하고 추가):

from pandas._libs.parsers import STR_NA_VALUES

accepted_na_values = STR_NA_VALUES - {'NA'} | {'_'}
path = 'myexcel.xlsx'
df = pd.read_excel(path, keep_default_na=False, na_values=accepted_na_values)

판다를 사용하여 파일을 읽는 동안 매개 변수를 사용할 수 있습니다.na_filter = False또는keep_default_na=False 선에서

import pandas as pd

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

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

언급URL : https://stackoverflow.com/questions/33952142/prevent-pandas-from-interpreting-na-as-nan-in-a-string

반응형