programing

사각형 괄호를 사용하여 Pandas 열에 액세스 vs 점(속성 같은) 사용

megabox 2023. 9. 26. 22:14
반응형

사각형 괄호를 사용하여 Pandas 열에 액세스 vs 점(속성 같은) 사용

두 벨로우 케이스 모두:

import pandas

d = {'col1': 2, 'col2': 2.5}
df = pandas.DataFrame(data=d, index=[0])

print(df['col2'])
print(df.col2)

두 방법 모두 열에 색인을 붙여 같은 결과를 얻을 수 있는데, 두 방법 사이에 차이가 있습니까?

"점(dot) 표기법", 즉.df.col2편리함으로 노출되는 속성 접근입니다.

Series(영상 시리즈)의 인덱스, DataFrame(데이터프레임)의 열 및 Panel(패널)의 항목을 속성으로 직접 액세스할 수 있습니다.

df['col2']동일한 작업을 수행합니다. A를 반환합니다.pd.Series칼럼의

속성 액세스에 대한 몇 가지 주의 사항:

  • 열을 추가할 수 없습니다(df.new_col = x작동하지 않을 것입니다. 더 나쁜 것은 실제로 열이 아닌 새로운 속성을 묵묵히 만들어 낼 것입니다 - 원숭이를 생각하세요- 여기 patching).
  • 열 이름에 공백이 있거나 열 이름이 정수인 경우에는 작동하지 않습니다.

이름이 단순한 단일 열에 액세스하는 길이는 동일하지만 괄호 표기를 사용하면 더 많은 작업을 수행할 수 있습니다.사용만 가능합니다.df.col열 이름이 유효한 Python 식별자인 경우(예: 공백 등을 포함하지 않음).또한 열 이름이 pandas 메서드 이름과 충돌할 경우 예상치 못한 일이 발생할 수 있습니다(예:sum괄호를 사용하여 여러 열을 선택할 수 있습니다(예:df[['col1', 'col2']]) 또는 새 열을 추가합니다(df['newcol'] = ...), 도트 액세스로는 할 수 없습니다.

연결한 다른 질문이 적용되지만 훨씬 더 일반적인 질문입니다.Python 개체는 다음과 같이.그리고.[]연산자들이 그들에게 적용됩니다.Pandas DataFrame은 위에서 설명한 주의 사항과 함께 단일 열에 액세스하는 경우가 제한된 경우에 동일하게 만들기로 선택했습니다.

차이점에 대한 단답형:

  • [] 인덱싱(대괄호 액세스)은 DataFrame 열 데이터에서 작동할 수 있는 전체 기능을 갖습니다.
  • 속성 액세스(dot access)는 주로 기존 DataFrame 열 데이터에 액세스하기 위한 편의를 위한 것이지만 때때로 한계(예: 특수 열 이름, 새 열 만들기)가 있습니다.

자세한 설명

Series와 DataFrame은 팬더의 핵심 클래스이자 데이터 구조이며 당연히 Python 클래스이기도 합니다. 따라서 팬더 DataFrame과 일반 Python 객체 간의 속성 액세스를 포함할 때 약간의 차이가 있습니다.하지만 그것은 잘 기록되어 있고 쉽게 이해할 수 있습니다.몇 가지 참고 사항:

  1. Python에서 사용자는 속성 액세스를 사용하여 자신의 데이터 속성을 인스턴스 개체에 동적으로 추가할 수 있습니다.

    >>> class Dog(object):
    ...     pass
    >>> dog = Dog()
    >>> vars(dog)
    {}
    >>> superdog = Dog()
    >>> vars(superdog)
    {}
    >>> dog.legs = 'I can run.'
    >>> superdog.wings = 'I can fly.'
    >>> vars(dog)
    {'legs': 'I can run.'}
    >>> vars(superdog)
    {'wings': 'I can fly.'}
    
  2. 팬더의 경우 인덱스이 데이터 구조와 밀접한 관련이 있으므로 영상 시리즈의 인덱스, DataFrame의 열에 속성으로 액세스할 수 있습니다.

    >>> import pandas as pd
    >>> import numpy as np
    >>> data = np.random.randint(low=0, high=10, size=(2,2))
    >>> df = pd.DataFrame(data, columns=['a', 'b'])
    >>> df
       a  b
    0  7  6
    1  5  8
    >>> vars(df)
    {'_is_copy': None, 
     '_data': BlockManager
        Items: Index(['a', 'b'], dtype='object')
        Axis 1: RangeIndex(start=0, stop=2, step=1)
        IntBlock: slice(0, 2, 1), 2 x 2, dtype: int64,
     '_item_cache': {}}
    
  3. 그러나 팬더 속성 액세스는 주로 DataFrame의 Series 또는 Column의 기존 요소를 읽고 수정하는 데 편리합니다.

    >>> df.a
    0    7
    1    5
    Name: a, dtype: int64
    >>> df.b = [1, 1]
    >>> df
       a  b
    0  7  1
    1  5  1
    
  4. 그리고 편리함은 완전한 기능에 대한 보상입니다.예: 열 이름을 사용하여 DataFrame 개체를 생성할 수 있습니다.['space bar', '1', 'loc', 'min', 'index'] 한 Python ()가수 .1,space bar또는 기존 특성 이름과 충돌합니다.

    >>> data = np.random.randint(0, 10, size=(2, 5))
    >>> df_special_col_names = pd.DataFrame(data, columns=['space bar', '1', 'loc', 'min', 'index'])
    >>> df_special_col_names
       space bar  1  loc  min  index
    0          4  4    4    8      9
    1          3  0    1    2      3
    
  5. .loc,.iloc그리고.[]인덱싱은 Series 및 DataFrame 개체의 인덱스 및 열에 완전히 액세스/작동하는 정의된 방법입니다.

    >>> df_special_col_names['space bar']
    0    4
    1    3
    Name: space bar, dtype: int64
    >>> df_special_col_names.loc[:, 'min']
    0    8
    1    2
    Name: min, dtype: int64
    >>> df_special_col_names.iloc[:, 1]
    0    4
    1    0
    Name: 1, dtype: int64
    
  6. 또 다른 중요한 차이점은 DataFrame에 대한 새 열을 만들 때입니다.당신이 볼 수 있듯이.df.c = df.a + df.b방금 코어 데이터 구조와 함께 속성을 생성했기 때문에 버전 이후부터는 동작으로 인해 (더 이상 silent하지 않음)생성됩니다.

    >>> df
       a  b
    0  7  1
    1  5  1
    
    >>> df.c = df.a + df.b
    __main__:1: UserWarning: Pandas doesn't allow columns to be created via a new attribute name - see https://pandas.pydata.org/pandas-docs/stable/indexing.html#attribute-access`
    
    >>> df['d'] = df.a + df.b
    >>> df
       a  b  d
    0  7  1  8
    1  5  1  6
    >>> df.c
    0    8
    1    6
    dtype: int64
    >>> vars(df)
    {'_is_copy': None, 
     '_data': 
        BlockManager
        Items: Index(['a', 'b', 'd'], dtype='object')
        Axis 1: RangeIndex(start=0, stop=2, step=1)
        IntBlock: slice(0, 2, 1), 2 x 2, dtype: int64
        IntBlock: slice(2, 3, 1), 1 x 2, dtype: int64, 
     '_item_cache': {},
     'c': 0    8
          1    6
          dtype: int64}
    
  7. 마지막으로 DataFrame에 대한 새 열을 만들려면 속성 액세스를 사용하지 마십시오.올바른 방법은 또는 색인을 사용하는 것입니다.

    >>> df
       a  b
    0  7  6
    1  5  8
    >>> df['c'] = df.a + df.b 
    >>> # OR
    >>> df.loc[:, 'c'] = df.a + df.b
    >>> df # c is an new added column
       a  b   c
    0  7  6  13
    1  5  8  13
    

.표기법은 상호작용적으로 작업할 때와 탐험을 할 때 매우 유용합니다.하지만 코드명확성과 미친짓을 피하기 위해서는[]표기법 use를 사용해야 하는 []새 열을 만들 때.

df = pd.DataFrame(data={'A':[1, 2, 3],
                    'B':[4,5,6]})

# this has no effect
df.D = 11
df

    A  B
 0  1  4
 1  2  5
 2  3  6
# but this works
df['D'] = 11
df

Out[19]: 
   A  B   D
0  1  4  11
1  2  5  11  
2  3  6  11

이와 같은 데이터 프레임이 있다면(이 열 이름을 추천하는 은 아닙니다)

df = pd.DataFrame({'min':[1,2], 'max': ['a','a'], 'class': [1975, 1981], 'sum': [3,4]})

print(df)

   min max  class  sum
0    1   a   1975    3
1    2   a   1981    4

모든 것이 괜찮아 보이고 오류도 없습니다.다를 할 수 .df['min']등..

print(df['min'])

0    1
1    2
Name: min, dtype: int64

했다면, .df.<column_name>문제가 발생할 수 있습니다.

print(df.min)

<bound method NDFrame._add_numeric_operations.<locals>.min of    min max  class  sum
0    1   a   1975    3
1    2   a   1981    4>

print(df.max)

<bound method NDFrame._add_numeric_operations.<locals>.max of    min max  class  sum
0    1   a   1975    3
1    2   a   1981    4>

print(df.class)

  File "<ipython-input-31-3472b02a328e>", line 1
    print(df.class)
             ^
SyntaxError: invalid syntax
    
print(df.sum)

<bound method NDFrame._add_numeric_operations.<locals>.sum of    min max  class  sum
0    1   a   1975    3
1    2   a   1981    4>

언급URL : https://stackoverflow.com/questions/41130255/accessing-pandas-column-using-squared-brackets-vs-using-a-dot-like-an-attribute

반응형