codememo

DataFrame의 문자열이지만 dtype은 개체입니다.

tipmemo 2023. 7. 17. 21:09
반응형

DataFrame의 문자열이지만 dtype은 개체입니다.

선택한 열의 모든 항목이 문자열이지만 명시적으로 변환한 후에도 Panda가 개체가 있다고 말하는 이유는 무엇입니까?

다음은 제 데이터 프레임입니다.

<class 'pandas.core.frame.DataFrame'>
Int64Index: 56992 entries, 0 to 56991
Data columns (total 7 columns):
id            56992  non-null values
attr1         56992  non-null values
attr2         56992  non-null values
attr3         56992  non-null values
attr4         56992  non-null values
attr5         56992  non-null values
attr6         56992  non-null values
dtypes: int64(2), object(5)

그중 5개는dtype object이러한 개체를 문자열로 명시적으로 변환합니다.

for c in df.columns:
    if df[c].dtype == object:
        print "convert ", df[c].name, " to string"
        df[c] = df[c].astype(str)

그리고나서,df["attr2"]여전히 가지고 있습니다.dtype object,비록 ~일지라도type(df["attr2"].ix[0]드러나다str어느 쪽이 맞습니까?

판다는 다음을 구별합니다.int64그리고.float64그리고.object없을 때 그 이면의 논리는 무엇입니까?dtype str이유는?str으로 뒤덮인.object?

dtype객체는 NumPy에서 왔으며, 그것은 요소의 유형을 설명합니다.ndarrayan의 모든 요소ndarray크기(바이트)가 같아야 합니다.위해서int64그리고.float64그것들은 8바이트입니다.그러나 문자열의 경우 문자열의 길이가 고정되어 있지 않습니다.그래서 문자열 바이트를 저장하는 대신ndarray직접적으로, 팬더는 물체를 사용합니다.ndarray그것은 객체에 대한 포인터를 저장합니다; 이것 때문에.dtype이런 종류의ndarrayis object입니다.

다음은 예입니다.

  • int64 배열은 4 int64 값을 포함합니다.
  • 개체 배열에는 3개의 문자열 개체에 대한 4개의 포인터가 포함되어 있습니다.

enter image description here

@HYRY의 대답은 좋습니다.상황을 좀 더 설명하고 싶습니다.

어레이는 데이터를 연속적고정 크기의 메모리 블록으로 저장합니다.이러한 속성을 함께 사용하면 어레이가 데이터 액세스 속도를 높일 수 있습니다.예를 들어 컴퓨터가 32비트 정수 배열을 저장하는 방법을 생각해 보십시오.[3,0,1].

enter image description here

컴퓨터에서 배열의 세 번째 요소를 가져오라고 하면 처음부터 시작하여 64비트를 건너 뛰어서 세 번째 요소로 이동합니다.몇 개의 비트를 건너야 하는지 정확히 아는 것이 어레이를 빠르게 만드는 이유입니다.

이제 문자열의 순서를 생각해 보겠습니다.['hello', 'i', 'am', 'a', 'banana']문자열은 크기가 다양한 객체입니다. 따라서 연속적인 메모리 블록에 저장하려고 하면 이렇게 됩니다.

enter image description here

이제 컴퓨터에는 임의로 요청한 요소에 빠르게 액세스할 수 있는 방법이 없습니다.이를 극복하는 열쇠는 포인터를 사용하는 것입니다.기본적으로 각 문자열을 임의의 메모리 위치에 저장하고 배열을 각 문자열의 메모리 주소로 채웁니다. (메모리 주소는 정수일 뿐입니다.)그래서 지금 상황은 이렇습니다.

enter image description here

이제 컴퓨터에 세 번째 요소를 가져오라고 요청하면 이전과 마찬가지로 64비트를 건너뛸 수 있습니다(메모리 주소가 32비트 정수라고 가정). 그런 다음 문자열을 가져오려면 한 단계를 더 수행해야 합니다.

NumPy의 문제는 포인터가 실제로 문자열을 가리킨다는 보장이 없다는 것입니다.그래서 dtype을 'object'로 보고하는 것입니다.

뻔뻔스럽게도 내가 처음에 이것에 대해 논의했던 NumPy에서 내 자신의 과정을 막으려고 합니다.

받아들여진 답은 좋습니다.저는 단지 서류를 참고하고 싶었습니다.설명서에는 다음과 같이 나와 있습니다.

판다는 문자열을 저장하기 위해 개체 dtype을 사용합니다.

수락된 답변은 "이유"를 설명하는 데 큰 도움이 되었습니다. 문자열은 가변 길이입니다.

그러나 문자열의 경우 문자열의 길이가 고정되어 있지 않습니다.

하지만 수용된 답변에 대한 주요 논평이 한때 말했듯이: "걱정하지 마세요; 원래 이런 식입니다."

버전 1.0.0(2020년 1월)부터 판다는 를 통해 문자열 유형을 1등급 지원하는 실험 기능으로 도입되었습니다.

볼 수 에.object은 " 적으로유다형은음지을수있사다습니용정할여하기본운새로▁aifying다▁can"를 지정하여 할 수 .dtypepd.StringDtype아니면 간단히'string':

>>> pd.Series(['abc', None, 'def'])
0     abc
1    None
2     def
dtype: object
>>> pd.Series(['abc', None, 'def'], dtype=pd.StringDtype())
0     abc
1    <NA>
2     def
dtype: string
>>> pd.Series(['abc', None, 'def']).astype('string')
0     abc
1    <NA>
2     def
dtype: string

언급URL : https://stackoverflow.com/questions/21018654/strings-in-a-dataframe-but-dtype-is-object

반응형