사각형 괄호를 사용하여 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 객체 간의 속성 액세스를 포함할 때 약간의 차이가 있습니다.하지만 그것은 잘 기록되어 있고 쉽게 이해할 수 있습니다.몇 가지 참고 사항:
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.'}
팬더의 경우 인덱스 및 열이 데이터 구조와 밀접한 관련이 있으므로 영상 시리즈의 인덱스, 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': {}}
그러나 팬더 속성 액세스는 주로 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
그리고 편리함은 완전한 기능에 대한 보상입니다.예: 열 이름을 사용하여 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
은
.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
또 다른 중요한 차이점은 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}
마지막으로 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
'programing' 카테고리의 다른 글
이벤트 핸들러 이전에 jQuery에서 ajax 응답을 가로채려면 어떻게 해야 합니까? (0) | 2023.09.26 |
---|---|
javax.xml.bind.모듈 경로 또는 클래스 경로에서 JAXB-API의 JAXB 예외 구현을 찾을 수 없습니다. (0) | 2023.09.26 |
여러 PHP 페이지에 걸쳐 AJAX 함수의 채워진 변수로 SQL 쿼리 업데이트 (0) | 2023.09.26 |
입력 및 출력 db가 서로 다른 두 데이터베이스 서버에 있는 경우 Render Mapping을 사용할 수 있습니까? (0) | 2023.09.26 |
안드로이드에서 테두리가 있는 테이블을 만들려면 어떻게 해야 합니까? (0) | 2023.09.26 |