IT

판다 다중 지수 - 열을 사용할 때 2단계를 선택하는 방법은 무엇입니까?

itgroup 2023. 5. 13. 09:28
반응형

판다 다중 지수 - 열을 사용할 때 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

@JohnZwinck의 데이터 샘플 사용:

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

반응형