[PYTHON] pandas : MultiIndex를 2 차 인덱스의 범위로 분할합니다.
PYTHONpandas : MultiIndex를 2 차 인덱스의 범위로 분할합니다.
다음과 같이 MultiIndex가있는 시리즈가 있습니다.
import numpy as np
import pandas as pd
buckets = np.repeat(['a','b','c'], [3,5,1])
sequence = [0,1,5,0,1,2,4,50,0]
s = pd.Series(
np.random.randn(len(sequence)),
index=pd.MultiIndex.from_tuples(zip(buckets, sequence))
)
# In [6]: s
# Out[6]:
# a 0 -1.106047
# 1 1.665214
# 5 0.279190
# b 0 0.326364
# 1 0.900439
# 2 -0.653940
# 4 0.082270
# 50 -0.255482
# c 0 -0.091730
두 번째 인덱스 ( 'sequence')가 2에서 10 사이 인 s [ 'b'] 값을 얻고 싶습니다.
첫 번째 인덱스에서 슬라이스가 잘 작동합니다.
s['a':'b']
# Out[109]:
# bucket value
# a 0 1.828176
# 1 0.160496
# 5 0.401985
# b 0 -1.514268
# 1 -0.973915
# 2 1.285553
# 4 -0.194625
# 5 -0.144112
그러나 적어도 두 가지 가장 명백한 방법 인 것으로 보이는 것에 의해 두 번째는 아닙니다.
1) 인덱스 값과 아무 관계없이 요소 1에서 4를 반환합니다.
s['b'][1:10]
# In [61]: s['b'][1:10]
# Out[61]:
# 1 0.900439
# 2 -0.653940
# 4 0.082270
# 50 -0.255482
그러나 인덱스를 반대로하고 첫 번째 인덱스가 정수이고 두 번째 인덱스가 문자열이면 작동합니다.
In [26]: s
Out[26]:
0 a -0.126299
1 a 1.810928
5 a 0.571873
0 b -0.116108
1 b -0.712184
2 b -1.771264
4 b 0.148961
50 b 0.089683
0 c -0.582578
In [25]: s[0]['a':'b']
Out[25]:
a -0.126299
b -0.116108
해결법
-
==============================
1.Robbie-Clarken이 대답을하면, 0.14부터 loc에 전달하는 튜플에 슬라이스를 전달할 수 있습니다.
Robbie-Clarken이 대답을하면, 0.14부터 loc에 전달하는 튜플에 슬라이스를 전달할 수 있습니다.
In [11]: s.loc[('b', slice(2, 10))] Out[11]: b 2 -0.65394 4 0.08227 dtype: float64
사실, 각 레벨에 슬라이스를 전달할 수 있습니다.
In [12]: s.loc[(slice('a', 'b'), slice(2, 10))] Out[12]: a 5 0.27919 b 2 -0.65394 4 0.08227 dtype: float64
참고 : 슬라이스가 포함됩니다.
다음을 사용하여이 작업을 수행 할 수도 있습니다.
s.ix[1:10, "b"]
(이 버전은 할당이 가능하기 때문에 단일 ix / loc / iloc에서 수행하는 것이 좋습니다.)
이 답변은 2013 년 초에 iloc이 도입되기 전에 작성되었으므로 위치 / 정수 위치 -이 경우 선호 될 수 있습니다. 그것이 만들어진 이유는 정수로 색인 된 팬더 객체의 애매함을 제거하고 더 자세하게 설명하기 위해서였습니다 : "나는 자세를 취하고 있습니다".
s["b"].iloc[1:10]
즉, 나는 ix가 다음과 같은 문서에 다소 동의합니다.
그렇지 않습니다. 가장 일관된 방법은 현재 수행중인 작업을 설명하는 것입니다.
파이썬의 선을 기억하십시오.
-
==============================
2.pandas 0.14.0에서 .loc 슬라이스 객체를 포함하는 튜플을 제공함으로써 다중 색인 객체를 슬라이스 할 수 있습니다.
pandas 0.14.0에서 .loc 슬라이스 객체를 포함하는 튜플을 제공함으로써 다중 색인 객체를 슬라이스 할 수 있습니다.
In [2]: s.loc[('b', slice(2, 10))] Out[2]: b 2 -1.206052 4 -0.735682 dtype: float64
-
==============================
3.내가 생각할 수있는 가장 좋은 방법은이 경우에 '선택'을 사용하는 것입니다. 문서에서 "이 방법은 더 이상 직접적인 방법이 없을 때만 사용해야합니다."라고 말합니다.
내가 생각할 수있는 가장 좋은 방법은이 경우에 '선택'을 사용하는 것입니다. 문서에서 "이 방법은 더 이상 직접적인 방법이 없을 때만 사용해야합니다."라고 말합니다.
데이터 인덱싱 및 선택
In [116]: s Out[116]: a 0 1.724372 1 0.305923 5 1.780811 b 0 -0.556650 1 0.207783 4 -0.177901 50 0.289365 0 1.168115 In [117]: s.select(lambda x: x[0] == 'b' and 2 <= x[1] <= 10) Out[117]: b 4 -0.177901
-
==============================
4.이것이 이상적인지는 모르지만 마스크를 작성하여 작동합니다.
이것이 이상적인지는 모르지만 마스크를 작성하여 작동합니다.
In [59]: s.index Out[59]: MultiIndex [('a', 0) ('a', 1) ('a', 5) ('b', 0) ('b', 1) ('b', 2) ('b', 4) ('b', 50) ('c', 0)] In [77]: s[(tpl for tpl in s.index if 2<=tpl[1]<=10 and tpl[0]=='b')] Out[77]: b 2 -0.586568 4 1.559988
편집 : 헤이든의 솔루션 갈 방법입니다
from https://stackoverflow.com/questions/13389203/pandas-slice-a-multiindex-by-range-of-secondary-index by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] Python - ISO 8601로 날짜 변환 (0) | 2018.10.23 |
---|---|
[PYTHON] Jquery 및 Django CSRF 토큰 (0) | 2018.10.23 |
[PYTHON] Python과 PhantomJS에서 Selenium을 사용하여 파일 시스템에 파일 다운로드 (0) | 2018.10.23 |
[PYTHON] 파이썬은 코드 포인트가 아닌 문자로 배열에 유니 코드 문자열을 인쇄합니다. (0) | 2018.10.23 |
[PYTHON] 항목을 목록 내부로 이동 하시겠습니까? (0) | 2018.10.23 |