반응형
다중 인덱스 판다에서 선택
열 'A'와 'B'가있는 다중 인덱스 데이터 프레임이 있습니다.
인덱스를 단일 열 인덱스로 재설정하지 않고 다중 인덱스의 한 열을 필터링하여 행을 선택하는 방법이 있습니까?
예를 들어.
# has multi-index (A,B)
df
#can I do this? I know this doesn't work because the index is multi-index so I need to specify a tuple
df.ix[df.A ==1]
한 가지 방법은 get_level_values
Index 메서드 를 사용하는 것입니다.
In [11]: df
Out[11]:
0
A B
1 4 1
2 5 2
3 6 3
In [12]: df.iloc[df.index.get_level_values('A') == 1]
Out[12]:
0
A B
1 4 1
0.13에서는 인수 xs
와 함께drop_level
사용할 수 있습니다 .
df.xs(1, level='A', drop_level=False) # axis=1 if columns
참고 : 이것이 인덱스가 아닌 MultiIndex 열인 경우 동일한 기술을 사용할 수 있습니다.
In [21]: df1 = df.T
In [22]: df1.iloc[:, df1.columns.get_level_values('A') == 1]
Out[22]:
A 1
B 4
0 1
query
내 의견으로는 매우 읽기 쉽고 사용하기 쉬운 사용할 수도 있습니다.
import pandas as pd
df = pd.DataFrame({'A': [1, 2, 3, 4], 'B': [10, 20, 50, 80], 'C': [6, 7, 8, 9]})
df = df.set_index(['A', 'B'])
C
A B
1 10 6
2 20 7
3 50 8
4 80 9
염두에 둔 것에 대해 이제 간단히 할 수 있습니다.
df.query('A == 1')
C
A B
1 10 6
다음을 사용하여 더 복잡한 쿼리를 가질 수도 있습니다. and
df.query('A >= 1 and B >= 50')
C
A B
3 50 8
4 80 9
과 or
df.query('A == 1 or B >= 50')
C
A B
1 10 6
3 50 8
4 80 9
다른 색인 수준 에서 쿼리 할 수도 있습니다.
df.query('A == 1 or C >= 8')
돌아올 것이다
C
A B
1 10 6
3 50 8
4 80 9
쿼리 내에서 변수를 사용하려면 다음을 사용할 수 있습니다@
.
b_threshold = 20
c_threshold = 8
df.query('B >= @b_threshold and C <= @c_threshold')
C
A B
2 20 7
3 50 8
다음을 사용할 수 있습니다 DataFrame.xs()
.
In [36]: df = DataFrame(np.random.randn(10, 4))
In [37]: df.columns = [np.random.choice(['a', 'b'], size=4).tolist(), np.random.choice(['c', 'd'], size=4)]
In [38]: df.columns.names = ['A', 'B']
In [39]: df
Out[39]:
A b a
B d d d d
0 -1.406 0.548 -0.635 0.576
1 -0.212 -0.583 1.012 -1.377
2 0.951 -0.349 -0.477 -1.230
3 0.451 -0.168 0.949 0.545
4 -0.362 -0.855 1.676 -2.881
5 1.283 1.027 0.085 -1.282
6 0.583 -1.406 0.327 -0.146
7 -0.518 -0.480 0.139 0.851
8 -0.030 -0.630 -1.534 0.534
9 0.246 -1.558 -1.885 -1.543
In [40]: df.xs('a', level='A', axis=1)
Out[40]:
B d d
0 -0.635 0.576
1 1.012 -1.377
2 -0.477 -1.230
3 0.949 0.545
4 1.676 -2.881
5 0.085 -1.282
6 0.327 -0.146
7 0.139 0.851
8 -1.534 0.534
9 -1.885 -1.543
A
수준 을 유지하려면 ( drop_level
키워드 인수는 v0.13.0부터 만 사용 가능) :
In [42]: df.xs('a', level='A', axis=1, drop_level=False)
Out[42]:
A a
B d d
0 -0.635 0.576
1 1.012 -1.377
2 -0.477 -1.230
3 0.949 0.545
4 1.676 -2.881
5 0.085 -1.282
6 0.327 -0.146
7 0.139 0.851
8 -1.534 0.534
9 -1.885 -1.543
다음을 사용할 수 있습니다 DataFrame.loc
.
>>> df.loc[1]
예
>>> print(df)
result
A B C
1 1 1 6
2 9
2 1 8
2 11
2 1 1 7
2 10
2 1 9
2 12
>>> print(df.loc[1])
result
B C
1 1 6
2 9
2 1 8
2 11
>>> print(df.loc[2, 1])
result
C
1 7
2 10
또 다른 옵션은 다음과 같습니다.
filter1 = df.index.get_level_values('A') == 1
filter2 = df.index.get_level_values('B') == 4
df.iloc[filter1 & filter2]
Out[11]:
0
A B
1 4 1
참고 URL : https://stackoverflow.com/questions/18835077/selecting-from-multi-index-pandas
반응형
'code' 카테고리의 다른 글
SQL Server 연결 문자열을 설정하는 방법은 무엇입니까? (0) | 2020.10.16 |
---|---|
HTML5 캔버스에서 흐릿한 텍스트를 수정하려면 어떻게해야합니까? (0) | 2020.10.16 |
Swift에서 열거하는 동안 배열에서 제거 하시겠습니까? (0) | 2020.10.16 |
Visual Studio에서 프로젝트 네임 스페이스 변경 (0) | 2020.10.16 |
Bluetooth 장치가 연결되어 있는지 프로그래밍 방식으로 확인하는 방법은 무엇입니까? (0) | 2020.10.16 |