판다 다중 지수 - 열을 사용할 때 2단계를 선택하는 방법은 무엇입니까?
다음 인덱스가 있는 데이터 프레임이 있습니다.
index = pd.MultiIndex.from_product([['stock1','stock2'...],['price','volume'...]])
그것은 할 수 있는 유용한 구조입니다.df['stock1']
하지만 어떻게 모든 가격 데이터를 선택합니까?저는 그 서류를 이해할 수가 없습니다.
다음을 시도했지만 실패했습니다.df[:,'price']
df[:]['price']
df.loc(axis=1)[:,'close']
df['price]
일반적으로 이 지수 스타일이 어떤 이유로든 좋지 않은 생각으로 받아들여진다면, 어떤 것이 더 나은 선택일까요?제가 컬럼 레벨이 아닌 시계열의 레이블로 주식에 대한 다중 인덱스 지수를 선택해야 합니까?
대단히 고맙습니다
편집 - 저는 색인이 아닌 열에 대해 다중 색인을 사용하고 있습니다(문구가 저를 능가했습니다).설명서의 예제는 열 구조가 아닌 다단계 인덱스에 중점을 둡니다.
John의 데이터 샘플 사용:
사용.xs()
이것은 a를 자르는 또 다른 방법입니다.MultiIndex
:
df
0
stock1 price 1
volume 2
stock2 price 3
volume 4
stock3 price 5
volume 6
df.xs('price', level=1, drop_level=False)
0
stock1 price 1
stock2 price 3
stock3 price 5
또는 다음이 있는 경우MultiIndex
열 대신:
df
stock1 stock2 stock3
price volume price volume price volume
0 1 2 3 4 5 6
df.xs('price', axis=1, level=1, drop_level=False)
stock1 stock2 stock3
price price price
0 1 3 5
In [132]: df
Out[132]:
0
stock1 price 1
volume 2
stock2 price 3
volume 4
stock3 price 5
volume 6
옵션 1:
In [133]: df.loc[(slice(None), slice('price')), :]
Out[133]:
0
stock1 price 1
stock2 price 3
stock3 price 5
옵션 2:
In [134]: df.loc[pd.IndexSlice[:, 'price'], :]
Out[134]:
0
stock1 price 1
stock2 price 3
stock3 price 5
업데이트:
하지만 2차 지수의 경우 가격을 제외한 모든 것을 선택하고 싶고 열거가 불가능하도록 여러 개의 값이 있다면 어떨까요?슬라이스(~'가격') 같은 것이 있습니까?
먼저 인덱스 레벨의 이름을 지정합니다.
df = df.rename_axis(["lvl0", "lvl1"])
이제 우리는 그것을 사용할 수 있습니다.df.query()
방법:
In [18]: df.query("lvl1 != 'price'")
Out[18]:
0
lvl0 lvl1
stock1 volume 2
stock2 volume 4
stock3 volume 6
MultiIndex 열이 사용되는 DataFrame의 2차 열에 액세스하는 가장 직관적인 솔루션을 찾았습니다..loc
와 함께slice()
.
데이터 프레임의 경우
df
stock1 stock2 stock3
price volume price volume price volume
0 1 2 3 4 5 6
1 2 3 4 5 6 7
사용.df.loc[:, (slice(None), "price")]
하위 열이 있는 모든 열을 전달합니다."price"
stock1 stock2 stock3
price price price
0 1 3 5
1 2 4 6
이내에df.loc[:, (slice(None), "price")]
loc의 첫 번째 주장:
모든 행, 두 번째 인수에 대한 결과를 전달합니다.(slice(None), "price")
모든 첫 번째 레벨 열을 선택하는 튜플입니다(slice(None)
) 및 이름이 다음과 같은 모든 2차 수준 열"price"
.
df.unstack()
마지막 레벨을 "오프"할 것입니다.MultiIndex
데이터 유형당 하나의 열로 데이터 프레임을 훨씬 더 전통적으로 만들 수 있습니다.예:
index = pd.MultiIndex.from_product([['stock1','stock2','stock3'],['price','volume']])
df = pd.DataFrame([1,2,3,4,5,6], index)
print(df.unstack())
제공:
0
price volume
stock1 1 2
stock2 3 4
stock3 5 6
@MaxU's가 더 나은 답변이지만, 여기서 MultiIndex의 모든 부분을 개별적으로 reset_index할 수도 있습니다. 예를 들어, 다음과 같이 가정합니다.
df = pd.DataFrame({
'price':range(6),
'stocks': [f'stock{i//2}' for i in range(6)],
'attr':['price','volume']*3
}).set_index(['stocks','attr'])
df로 연결:
price
stocks attr
stock0 price 0
volume 1
stock1 price 2
volume 3
stock2 price 4
volume 5
다음과 같은 경우:
df_rst = df.reset_index('attr')
df_rst[df_rst['attr']=='price']
다음과 같은 결과를 가져올 것입니다.
먼저 레벨을 스왑한 다음 첫 번째 레벨을 기준으로 선택할 수도 있습니다(@ntg의 샘플 데이터 기준).
df = pd.DataFrame({
'value': range(6),
'stocks': [f'stock{i // 2}' for i in range(6)],
'attr': ['price', 'volume'] * 3
}).set_index(['stocks', 'attr'])
df.swaplevel().loc["price"]
value
stocks
stock0 0
stock1 2
stock2 4
다음을 포함하는 열에서 작업합니다.axis=1
뿐만 아니라.
또한 이 옵션을 놓치셨습니다.
df.loc[:,"price"]
시간 데이터에 대한 모범 사례에 대해서는 행에 해당하는 열에 보관하십시오. 가급적이면 Python의 datetime 개체로 보관하십시오(판다에서 이에 대한 기능 지원이 내장되어 있음).마스크 구문을 사용하여 관심 있는 시간만 얻을 수 있습니다.
이렇게 하면 데이터 프레임의 단일 열에 액세스할 수 있습니다.그러나 여러 열의 경우 목록을 전달하거나 콜론을 사용하여 다음을 모두 가져올 수 있습니다.
df.loc[:,["price","volume"]]
#or
df.loc[:,:]
마스크를 사용하여 원하는 조건을 충족할 행/열을 지정하는 것이 유용합니다.
Mask=df.loc[:,"price"]>50.0
df.loc[Mask, "stock"] #should return the stock prices greater than 50bucks.
이것이 도움이 되기를 바라며, 제가 당신의 질문을 완전히 오해했다면 언제든지 이 답변에 대해 후속 조치를 취하십시오. 저는 더 많은 도움을 드리고 싶습니다.
언급URL : https://stackoverflow.com/questions/45128523/pandas-multiindex-how-to-select-second-level-when-using-columns
'IT' 카테고리의 다른 글
Xcode 7 베타 경고:인터페이스 방향 및 시작 스토리보드 (0) | 2023.05.18 |
---|---|
socket.io 과 웹 소켓의 차이점 (0) | 2023.05.13 |
수업에서 스토리보드를 프로그래밍 방식으로 로드하려면 어떻게 해야 합니까? (0) | 2023.05.13 |
C# 콘솔 앱에서 Ctrl+C(SIGINT)를 어떻게 트랩합니까? (0) | 2023.05.13 |
불변 문화와 순서 문자열 비교의 차이 (0) | 2023.05.13 |