반응형
다중 인덱스 DataFrame의 인덱스를 하나만 선택합니다.
다중 인덱스 DataFrame에서 하나의 인덱스만을 사용하여 새로운 DataFrame을 생성하려고 합니다.
A B C
first second
bar one 0.895717 0.410835 -1.413681
two 0.805244 0.813850 1.607920
baz one -1.206412 0.132003 1.024180
two 2.565646 -0.827317 0.569605
foo one 1.431256 -0.076467 0.875906
two 1.340309 -1.187678 -2.211372
qux one -1.170299 1.130127 0.974466
two -0.226169 -1.436737 -2.006747
이상적으로는 다음과 같은 것을 원합니다.
In: df.ix[level="first"]
그리고:
Out:
A B C
first
bar 0.895717 0.410835 -1.413681
0.805244 0.813850 1.607920
baz -1.206412 0.132003 1.024180
2.565646 -0.827317 0.569605
foo 1.431256 -0.076467 0.875906
1.340309 -1.187678 -2.211372
qux -1.170299 1.130127 0.974466
-0.226169 -1.436737 -2.006747
`
기본적으로 레벨이 아닌 다중 인덱스의 다른 모든 인덱스를 삭제하고 싶습니다.first
. 이것을 쉽게 할 수 있는 방법이 있습니까?
한 가지 방법은 단순히 재결합하는 것일 수 있습니다.df.index
원하는 수준의 MultiIndex를 선택할 수 있습니다.보관할 레이블 이름을 지정하여 이 작업을 수행할 수 있습니다.
df.index = df.index.get_level_values('first')
또는 레벨의 정수 값을 사용합니다.
df.index = df.index.get_level_values(0)
MultiIndex의 다른 모든 수준은 여기서 사라집니다.
이 솔루션은 상당히 새로운 것이며 다음과 같은 기능을 사용합니다.
In [88]: df.xs('bar', level='first')
Out[88]:
Second Third
one A -2.315312
B 0.497769
C 0.108523
two A -0.778303
B -1.555389
C -2.625022
dtype: float64
다음과 같이 다중 지수를 사용할 수도 있습니다.
In [89]: df.xs(('bar', 'A'), level=('First', 'Third'))
Out[89]:
Second
one -2.315312
two -0.778303
dtype: float64
예제에 대한 설정은 아래와 같습니다.
import pandas as pd
import numpy as np
arrays = [
np.array(['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux']),
np.array(['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two'])
]
index = pd.MultiIndex.from_tuples(list(zip(*arrays)), names=['first', 'second'])
df = pd.DataFrame(np.random.randn(3, 8), index=['A', 'B', 'C'], columns=index)
df.index.names = pd.core.indexes.frozen.FrozenList(['First', 'Second', 'Third'])
df = df.unstack()
get_level_values(0)를 이용하여 다중 인덱스 그룹의 첫 번째 레벨 인덱스를 구하여 인코딩된 값의 집계 값과 기술 사전 값을 포함하는 데이터 프레임을 구축하였습니다.그룹의 "airline_enc" 값에 대한 인덱스를 다음과 같이 얻습니다.
def getAirlineByGrouped(grouped,dictGeneric):
mylist=[]
for key in grouped.index.get_level_values(0):
item=dictGeneric.get(key)
mylist.append(item)
return mylist
encoder=LabelEncoder()
df['airline_enc']=encoder.fit_transform(df['airline'])
dictAirline= df[['airline_enc','airline']].set_index('airline_enc').to_dict()
grouped=results.groupby(['airline_enc','rating'])['recommended'].count()
#print(grouped)
airlines=getAirlineByGrouped(grouped, dictAirline['airline'])
result_df=pd.DataFrame({'index': grouped.index.get_level_values(0),'value':grouped.values,'airline':airlines})
result_df.plot(x='airline',y='value')
plt.xticks(rotation=90)
다른 방법으로 사용할 수 있습니다.pandas.DataFrame.droplevel
방법.예제의 유일한 단점은 인덱스 값이 더 이상 고유하지 않다는 것입니다.
In: df.droplevel('second')
Out:
A B C
first
bar 0.895717 0.410835 -1.413681
bar 0.805244 0.813850 1.607920
baz -1.206412 0.132003 1.024180
baz 2.565646 -0.827317 0.569605
foo 1.431256 -0.076467 0.875906
foo 1.340309 -1.187678 -2.211372
qux -1.170299 1.130127 0.974466
qux -0.226169 -1.436737 -2.006747
언급URL : https://stackoverflow.com/questions/28140771/select-only-one-index-of-multiindex-dataframe
반응형
'IT' 카테고리의 다른 글
C에서 특정 권한으로 유닉스 도메인 소켓을 만드는 방법? (0) | 2023.10.25 |
---|---|
MySQL 인덱싱 및 파일 정렬 사용 (0) | 2023.10.25 |
반응형 CSS 배경 이미지 (0) | 2023.10.25 |
connect/expressjs에서 "서명된" 쿠키란 무엇입니까? (0) | 2023.10.25 |
ASP의 다른 페이지로 리디렉션합니다.자바스크립트/jQuery를 이용한 NET MVC (0) | 2023.10.25 |