pandas의 기본 데이터 구조에 대한 빠르고 포괄적이지 않은 개요부터 시작하겠습니다.
데이터 유형, 인덱싱 및 축 레이블 지정/정렬에 대한 기본 동작은 모든 개체에 적용됩니다. 시작하려면 NumPy를 가져오고 pandas를 네임스페이스에 로드합니다.
In [1]: import numpy as np
In [2]: import pandas as pd
다음은 명심해야 할 기본 원칙입니다.
데이터 정렬은 본질적 입니다. 레이블과 데이터 간의 연결은 사용자가 명시적으로 수행하지 않는 한 끊어지지 않습니다.
시리즈
Series모든 데이터 유형(정수, 문자열, 부동 소수점 숫자, Python 객체 등)을 보유할 수 있는 1차원 레이블 배열입니다. 축 레이블을 집합적으로 인덱스 라고 합니다 . 시리즈를 만드는 기본 방법은 다음을 호출하는 것입니다.
>>> s = pd.Series(data, index=index)
여기에서 data여러 가지가 있을 수 있습니다.
- 파이썬 딕셔너리
- ndarray
- 스칼라 값(예: 5)
전달된 인덱스 는 축 레이블 목록입니다. 따라서 이것은 데이터가 무엇인지에 따라 몇 가지 경우로 나뉩니다 .
인덱스가 전달되지 않으면 값이 있는 인덱스가 생성됩니다 .
[0, ..., len(data) - 1]
In [3]: s = pd.Series(np.random.randn(5), index=["a", "b", "c", "d", "e"])
In [4]: s
Out[4]:
a 0.469112
b -0.282863
c -1.509059
d -1.135632
e 1.212112
dtype: float64
In [5]: s.index
Out[5]: Index(['a', 'b', 'c', 'd', 'e'], dtype='object')
In [6]: pd.Series(np.random.randn(5))
Out[6]:
0 -0.173215
1 0.119209
2 -1.044236
3 -0.861849
4 -2.104569
dtype: float64
메모
pandas는 고유하지 않은 인덱스 값을 지원합니다. 중복 인덱스 값을 지원하지 않는 작업을 시도하면 그 때 예외가 발생합니다.
딕셔너리에서
Series는 dicts에서 인스턴스화할 수 있습니다.
In [7]: d = {"b": 1, "a": 0, "c": 2}
In [8]: pd.Series(d)
Out[8]:
b 1
a 0
c 2
dtype: int64
메모
데이터가 사전이고 인덱스가 전달되지 않으면 SeriesPython 버전 >= 3.6 및 pandas 버전 >= 0.23을 사용하는 경우 인덱스가 사전의 삽입 순서에 따라 정렬됩니다.
Python < 3.6 또는 pandas < 0.23을 사용하고 인덱스가 전달되지 않은 경우 Series인덱스는 사전순으로 정렬된 사전 키 목록이 됩니다.
위의 예에서 Python 버전이 3.6 미만이거나 pandas 버전이 0.23 미만인 Series경우 dict 키의 어휘 순서에 따라 정렬됩니다.['a', 'b', 'c']['b', 'a', 'c']
인덱스가 전달되면 인덱스의 레이블에 해당하는 데이터의 값이 제거됩니다.
In [9]: d = {"a": 0.0, "b": 1.0, "c": 2.0}
In [10]: pd.Series(d)
Out[10]:
a 0.0
b 1.0
c 2.0
dtype: float64
In [11]: pd.Series(d, index=["b", "c", "d", "a"])
Out[11]:
b 1.0
c 2.0
d NaN
a 0.0
dtype: float64
메모
NaN(숫자가 아님)은 팬더에서 사용되는 표준 누락 데이터 마커입니다.
스칼라 값에서
data스칼라 값의 경우, 인덱스를 제공해야합니다. 값은 index 의 길이와 일치하도록 반복됩니다 .
In [12]: pd.Series(5.0, index=["a", "b", "c", "d", "e"])
Out[12]:
a 5.0
b 5.0
c 5.0
d 5.0
e 5.0
dtype: float64
시리즈는 ndarray와 유사합니다
Series와 매우 유사하게 작동 ndarray하며 대부분의 NumPy 함수에 대한 유효한 인수입니다. 그러나 슬라이싱과 같은 작업은 인덱스도 슬라이싱합니다.
In [13]: s[0]
Out[13]: 0.4691122999071863
In [14]: s[:3]
Out[14]:
a 0.469112
b -0.282863
c -1.509059
dtype: float64
In [15]: s[s > s.median()]
Out[15]:
a 0.469112
e 1.212112
dtype: float64
In [16]: s[[4, 3, 1]]
Out[16]:
e 1.212112
d -1.135632
b -0.282863
dtype: float64
In [17]: np.exp(s)
Out[17]:
a 1.598575
b 0.753623
c 0.221118
d 0.321219
e 3.360575
dtype: float64
NumPy 배열과 마찬가지로 pandas 시리즈에는 dtype를 사용.
In [18]: s.dtype
Out[18]: dtype('float64')
실제 배열이 필요하면 Series사용하십시오 Series.array.
In [19]: s.array
Out[19]:
[ 0.4691122999071863, -0.2828633443286633, -1.5090585031735124, -1.1356323710171934, 1.2121120250208506] Length: 5, dtype: float64
배열에 액세스하는 것은 인덱스 없이 일부 작업을 수행해야 할 때 유용할 수 있습니다( 예: 자동 정렬 비활성화 ).
Series는 ndarray와 유사하지만 실제 ndarray 가 필요한 경우 Series.to_numpy()를 사용합니다
In [20]: s.to_numpy()
Out[20]: array([ 0.4691, -0.2829, -1.5091, -1.1356, 1.2121])
Series는 dict와 유사합니다
Series는 인덱스 레이블로 값을 가져오고 설정할 수 있다는 점에서 고정 크기 사전과 같습니다.
In [21]: s["a"]
Out[21]: 0.4691122999071863
In [22]: s["e"] = 12.0
In [23]: s
Out[23]:
a 0.469112
b -0.282863
c -1.509059
d -1.135632
e 12.000000
dtype: float64
In [24]: "e" in s
Out[24]: True
In [25]: "f" in s
Out[25]: False
레이블이 포함되어 있지 않으면 예외가 발생합니다.
>>> s["f"] KeyError: 'f'
이 get메서드를 사용하면 누락된 레이블이 None 또는 지정된 기본값을 반환합니다.
In [26]: s.get("f")
In [27]: s.get("f", np.nan)
Out[27]: nan
시리즈를 사용한 벡터화된 작업 및 레이블 정렬
원시 NumPy 배열로 작업할 때 값별로 루핑하는 것은 일반적으로 필요하지 않습니다.
pandas에서 Series로 작업할 때도 마찬가지입니다.
시리즈는 ndarray를 기대하는 대부분의 NumPy 메소드에 전달할 수도 있습니다.
In [28]: s + s
Out[28]:
a 0.938225
b -0.565727
c -3.018117
d -2.271265
e 24.000000
dtype: float64
In [29]: s * 2
Out[29]:
a 0.938225
b -0.565727
c -3.018117
d -2.271265
e 24.000000
dtype: float64
In [30]: np.exp(s)
Out[30]:
a 1.598575
b 0.753623
c 0.221118
d 0.321219
e 162754.791419
dtype: float64
Series와 ndarray의 주요 차이점은 Series 간의 작업이 레이블을 기반으로 데이터를 자동으로 정렬한다는 것입니다. 따라서 관련된 시리즈에 동일한 레이블이 있는지 여부를 고려하지 않고 계산을 작성할 수 있습니다.
In [31]: s[1:] + s[:-1]
Out[31]:
a NaN
b -0.565727
c -3.018117
d -2.271265
e NaN
dtype: float64
정렬되지 않은 Series 간의 작업 결과에는 관련된 인덱스 의 합집합 이 있습니다 .
한 시리즈 또는 다른 시리즈에서 레이블을 찾을 수 없으면 결과가 누락된 것으로 표시됩니다 .
명시적인 데이터 정렬 없이 코드를 작성할 수 있다는 것은 대화형 데이터 분석 및 연구에서 엄청난 자유와 유연성을 부여합니다.
pandas 데이터 구조의 통합 데이터 정렬 기능은 레이블이 지정된 데이터 작업을 위한 대부분의 관련 도구와 pandas를 구분합니다.
NAME 속성
시리즈에는 다음과 같은 name속성 도 있을 수 있습니다 .
In [32]: s = pd.Series(np.random.randn(5), name="something")
In [33]: s
Out[33]:
0 -0.494929
1 1.071804
2 0.721555
3 -0.706771
4 -1.039575
Name: something, dtype: float64
In [34]: s.name
Out[34]: 'something'
Series name는 많은 경우, 특히 아래에서 볼 수 있는 것처럼 DataFrame의 1D 조각을 가져올 때 자동으로 할당됩니다.
pandas.Series.rename()방법을 사용 하여 시리즈의 이름을 바꿀 수 있습니다 .
In [35]: s2 = s.rename("different")
In [36]: s2.name
Out[36]: 'different'