programing

판다의 콘캣 기능에서 '레벨', '키' 및 이름 인수는 무엇입니까?

css3 2023. 7. 24. 22:40

판다의 콘캣 기능에서 '레벨', '키' 및 이름 인수는 무엇입니까?

문의사항

  • 제가 어떻게 이용합니까pd.concat?
  • 무엇입니까?levels에 대한 논쟁?
  • 무엇입니까?keys에 대한 논쟁?
  • 모든 인수를 사용하는 방법을 설명하는 데 도움이 되는 많은 예가 있습니까?

판다스concat기능은 병합 유틸리티의 스위스 육군 나이프입니다.그것이 유용한 다양한 상황들이 있습니다.기존 설명서에는 일부 선택적 인수에 대한 몇 가지 세부 정보가 생략되어 있습니다.그 중에는levels그리고.keys논쟁들.저는 그 주장들이 무엇을 하는지 알아내기 시작했습니다.

저는 여러 가지 측면에서 관문 역할을 할 질문을 제기할 것입니다.pd.concat.

데이터 프레임 고려d1,d2,그리고.d3:

import pandas as pd

d1 = pd.DataFrame(dict(A=.1, B=.2, C=.3), [2, 3])
d2 = pd.DataFrame(dict(B=.4, C=.5, D=.6), [1, 2])
d3 = pd.DataFrame(dict(A=.7, B=.8, D=.9), [1, 3])

만약 내가 이것들을 연결한다면,

pd.concat([d1, d2, d3], keys=['d1', 'd2', 'd3'])

저는 기대한 결과를 얻습니다.pandas.MultiIndex나로서는columns객체:

        A    B    C    D
d1 2  0.1  0.2  0.3  NaN
   3  0.1  0.2  0.3  NaN
d2 1  NaN  0.4  0.5  0.6
   2  NaN  0.4  0.5  0.6
d3 1  0.7  0.8  NaN  0.9
   3  0.7  0.8  NaN  0.9

그러나 인수 문서를 사용하고 싶었습니다.

수준: 시퀀스 목록, 기본값 없음.다중 인덱스를 구성하는 데 사용할 특정 수준(고유 값)입니다.그렇지 않으면 키에서 유추됩니다.

그래서 합격했습니다.

pd.concat([d1, d2, d3], keys=['d1', 'd2', 'd3'], levels=[['d1', 'd2']])

그리고.KeyError

ValueError: Key d3 not in level Index(['d1', 'd2'], dtype='object')

이게 말이 돼요.제가 통과한 레벨은 키로 표시된 필요한 레벨을 설명하기에 불충분했습니다.위에서 설명한 것처럼 아무것도 통과하지 못한 경우에는 수준이 추론됩니다(문서에 명시됨).하지만 더 나은 효과를 위해 이 주장을 어떻게 사용할 수 있을까요?

내가 대신 이것을 시도했다면:

pd.concat([d1, d2, d3], keys=['d1', 'd2', 'd3'], levels=[['d1', 'd2', 'd3']])

저는 위와 같은 결과를 얻었습니다.하지만 내가 레벨에 하나의 가치를 더하면,

df = pd.concat([d1, d2, d3], keys=['d1', 'd2', 'd3'], levels=[['d1', 'd2', 'd3', 'd4']])

결국 동일한 데이터 프레임이 생성되지만 결과적으로MultiIndex사용되지 않는 수준이 있습니다.

df.index.levels[0]

Index(['d1', 'd2', 'd3', 'd4'], dtype='object')

그래서 무슨 의미가 있습니까?level논쟁과 내가 사용해야 하는 것.keys다르게?

저는 Python 3.6과 Pandas 0.22를 사용하고 있습니다.

이 질문에 직접 답하는 과정에서 저는 많은 것을 배웠고, 예시와 몇 가지 설명의 카탈로그를 만들고 싶었습니다.

요점에 대한 구체적인 답변.levels논쟁은 끝을 향해 올 것입니다.

pandas.concat사라진 설명서

현재 설명서 링크

개체 가져오기 및 정의

import pandas as pd

d1 = pd.DataFrame(dict(A=.1, B=.2, C=.3), index=[2, 3])
d2 = pd.DataFrame(dict(B=.4, C=.5, D=.6), index=[1, 2])
d3 = pd.DataFrame(dict(A=.7, B=.8, D=.9), index=[1, 3])

s1 = pd.Series([1, 2], index=[2, 3])
s2 = pd.Series([3, 4], index=[1, 2])
s3 = pd.Series([5, 6], index=[1, 3])

논쟁들

objs

우리가 마주치는 첫 번째 논쟁은 다음과 같습니다.

objs: Series, DataFrame 또는 Panel 객체의 시퀀스 또는 매핑 딕트가 전달되면 전달되지 않는 한 정렬된 키가 키 인수로 사용되며, 이 경우 값이 선택됩니다(아래 참조).모두 None이 아닌 경우 None 개체는 자동으로 삭제되며 이 경우 ValueError가 발생합니다.

  • 일반적으로 다음 목록과 함께 사용됩니다.Series또는DataFrame물건들.
  • 그것을 보여드리겠습니다.dict매우 유용할 수도 있습니다.
  • 할 수 , 할▁using▁when▁may▁gener▁useful를 사용할 때 유용할 수 있습니다.map에 있어서와 같이map(f, list_of_df)

일단, 우리는 몇 가지 목록을 가지고 있겠습니다.DataFrame그리고.Series위에 정의된 객체사전을 활용하여 매우 유용한 정보를 제공하는 방법을 보여드리겠습니다.MultiIndex나중에 결과를 표시합니다.

pd.concat([d1, d2])

     A    B    C    D
2  0.1  0.2  0.3  NaN
3  0.1  0.2  0.3  NaN
1  NaN  0.4  0.5  0.6
2  NaN  0.4  0.5  0.6

axis

우리가 마주치는 두 번째 인수는 누구의 기본값입니까?0:

axis: {0/'index', 1/'columns', default 0 연결할 축입니다.

DataFrame에 로으.axis=0 (소리)

경 우의 0또는index"열을 따라 정렬하고 인덱스에 추가하십시오."라고 말합니다.

위에 표시된 바와 같이 사용한 장소axis=0, 냐면왜0 다값이며인, 음의를확수인있의 할 수 .d2의 인덱스를 확장합니다.d1가치의 중복에도 불구하고.2:

pd.concat([d1, d2], axis=0)

     A    B    C    D
2  0.1  0.2  0.3  NaN
3  0.1  0.2  0.3  NaN
1  NaN  0.4  0.5  0.6
2  NaN  0.4  0.5  0.6

DataFrame에 로으.axis=1 by side음향)(音源的))

값 경 우의 경우1또는columns우리는 "인덱스를 따라 정렬하고 열에 추가하라"고 말합니다.

pd.concat([d1, d2], axis=1)

     A    B    C    B    C    D
1  NaN  NaN  NaN  0.4  0.5  0.6
2  0.1  0.2  0.3  0.4  0.5  0.6
3  0.1  0.2  0.3  NaN  NaN  NaN

은 ▁from▁are▁we▁of▁and▁the▁extension다▁is▁the▁columns니있습▁the▁of수▁that▁the▁can▁see▁columns알▁union우▁resulting▁resulting▁index리▁indices장을확의 열 확장임을 알 수 있습니다.d1d2.

셋) 두또 (는세개개개)Series와 함께axis=0 (소리)

을 할 때pandas.Series를 따라서axis=0우리는 a를 돌려받습니다.pandas.Series 결의이름의 Series▁▁be 될 것입니다.None전부가 아니라면Series결합되는 것은 같은 이름을 가집니다. 하세요.'Name: A'때.Series그것이 존재하지 않을 때, 우리는 그것을 가정할 수 있습니다.Series은 이은입니다None.

               |                       |                        |  pd.concat(
               |  pd.concat(           |  pd.concat(            |      [s1.rename('A'),
 pd.concat(    |      [s1.rename('A'), |      [s1.rename('A'),  |       s2.rename('B'),
     [s1, s2]) |       s2])            |       s2.rename('A')]) |       s3.rename('A')])
-------------- | --------------------- | ---------------------- | ----------------------
2    1         | 2    1                | 2    1                 | 2    1
3    2         | 3    2                | 3    2                 | 3    2
1    3         | 1    3                | 1    3                 | 1    3
2    4         | 2    4                | 2    4                 | 2    4
dtype: int64   | dtype: int64          | Name: A, dtype: int64  | 1    5
               |                       |                        | 3    6
               |                       |                        | dtype: int64

셋) 두또 (는세개개개)Series와 함께axis=1 by side음향)(音源的))

을 할 때pandas.Series를 따라서axis=1은 그은것입니다.name으로 발생하는 열 하기 위해 입니다.pandas.DataFrame.

                       |                       |  pd.concat(
                       |  pd.concat(           |      [s1.rename('X'),
 pd.concat(            |      [s1.rename('X'), |       s2.rename('Y'),
     [s1, s2], axis=1) |       s2], axis=1)    |       s3.rename('Z')], axis=1)
---------------------- | --------------------- | ------------------------------
     0    1            |      X    0           |      X    Y    Z
1  NaN  3.0            | 1  NaN  3.0           | 1  NaN  3.0  5.0
2  1.0  4.0            | 2  1.0  4.0           | 2  1.0  4.0  NaN
3  2.0  NaN            | 3  2.0  NaN           | 3  2.0  NaN  6.0

혼된합Series그리고.DataFrame와 함께axis=0 (소리)

의 할 때Series그리고.DataFrame를 따라서axis=0는 모든 두모변니다합을 합니다.Series 열 한로에DataFrames의

이는 다음과 같은 연결입니다.axis=0즉, 열을 정렬하면서 인덱스(행)를 확장합니다.아래의 예에서, 우리는 지수가 다음과 같이 되는 것을 봅니다.[2, 3, 2, 3]그것은 무차별적으로 색인을 추가하는 것입니다.열 이름을 강제로 지정하지 않으면 열이 겹치지 않습니다.Series가 을하는칼인 열to_frame:

 pd.concat(               |
     [s1.to_frame(), d1]) |  pd.concat([s1, d1])
------------------------- | ---------------------
     0    A    B    C     |      0    A    B    C
2  1.0  NaN  NaN  NaN     | 2  1.0  NaN  NaN  NaN
3  2.0  NaN  NaN  NaN     | 3  2.0  NaN  NaN  NaN
2  NaN  0.1  0.2  0.3     | 2  NaN  0.1  0.2  0.3
3  NaN  0.1  0.2  0.3     | 3  NaN  0.1  0.2  0.3

의 를 볼 수 .pd.concat([s1, d1])마치 내가 그것을 수행한 것과 같습니다.to_frame자신

그러나 다음과 같은 매개 변수를 사용하여 결과 열의 이름을 제어할 수 있습니다.to_frame로 이름 Seriesrename방법이 결과의 열 이름을 제어하지 않습니다.DataFrame.

 # Effectively renames       |                            |
 # `s1` but does not align   |  # Does not rename.  So    |  # Renames to something
 # with columns in `d1`      |  # Pandas defaults to `0`  |  # that does align with `d1`
 pd.concat(                  |  pd.concat(                |  pd.concat(
     [s1.to_frame('X'), d1]) |      [s1.rename('X'), d1]) |      [s1.to_frame('B'), d1])
---------------------------- | -------------------------- | ----------------------------
     A    B    C    X        |      0    A    B    C      |      A    B    C
2  NaN  NaN  NaN  1.0        | 2  1.0  NaN  NaN  NaN      | 2  NaN  1.0  NaN
3  NaN  NaN  NaN  2.0        | 3  2.0  NaN  NaN  NaN      | 3  NaN  2.0  NaN
2  0.1  0.2  0.3  NaN        | 2  NaN  0.1  0.2  0.3      | 2  0.1  0.2  0.3
3  0.1  0.2  0.3  NaN        | 3  NaN  0.1  0.2  0.3      | 3  0.1  0.2  0.3

혼된합Series그리고.DataFrame와 함께axis=1 by side음향)(音源的))

이것은 꽤 직관적입니다.Series name은 기본적으로 " 열같이다습다니"의 됩니다.Series가 때객일 의 물체name특성을 사용할 수 없습니다.

                    |  pd.concat(
 pd.concat(         |      [s1.rename('X'),
     [s1, d1],      |       s2, s3, d1],
     axis=1)        |      axis=1)
------------------- | -------------------------------
   0    A    B    C |      X    0    1    A    B    C
2  1  0.1  0.2  0.3 | 1  NaN  3.0  5.0  NaN  NaN  NaN
3  2  0.1  0.2  0.3 | 2  1.0  4.0  NaN  0.1  0.2  0.3
                    | 3  2.0  NaN  6.0  0.1  0.2  0.3

join

세 번째 인수는 결과 병합이 외부 병합(기본값)이어야 하는지 또는 내부 병합이어야 하는지를 설명하는 것입니다.

조인: {'join', 'join', 기본값 'join'
다른 축의 인덱스를 처리하는 방법입니다.

보니, 알보니, 없니다가 없습니다.left또는right으로 사용할 수 .pd.concat병합할 개체를 두 개 이상 처리할 수 있습니다.

d1그리고.d2옵션은 다음과 같습니다.

outer

pd.concat([d1, d2], axis=1, join='outer')

     A    B    C    B    C    D
1  NaN  NaN  NaN  0.4  0.5  0.6
2  0.1  0.2  0.3  0.4  0.5  0.6
3  0.1  0.2  0.3  NaN  NaN  NaN

inner

pd.concat([d1, d2], axis=1, join='inner')

     A    B    C    B    C    D
2  0.1  0.2  0.3  0.4  0.5  0.6

join_axes

네 번째 주장은 우리가 우리의 일을 할 수 있게 해주는 것입니다.left합병 및 기타

join_axes: 인덱스 개체 목록
내부/외부 세트 로직을 수행하는 대신 다른 n - 1 축에 사용할 특정 인덱스.

왼쪽 병합

pd.concat([d1, d2, d3], axis=1, join_axes=[d1.index])

     A    B    C    B    C    D    A    B    D
2  0.1  0.2  0.3  0.4  0.5  0.6  NaN  NaN  NaN
3  0.1  0.2  0.3  NaN  NaN  NaN  0.7  0.8  0.9

오른쪽 병합

pd.concat([d1, d2, d3], axis=1, join_axes=[d3.index])

     A    B    C    B    C    D    A    B    D
1  NaN  NaN  NaN  0.4  0.5  0.6  0.7  0.8  0.9
3  0.1  0.2  0.3  NaN  NaN  NaN  0.7  0.8  0.9

ignore_index

ignore_index: 부울, 기본값 False
True인 경우 연결 축을 따라 인덱스 값을 사용하지 마십시오.결과 축에는 0, ..., n - 1 레이블이 지정됩니다.연결 축에 의미 있는 인덱싱 정보가 없는 개체를 연결하는 경우 유용합니다.다른 축의 인덱스 값은 조인 시에도 유지됩니다.

처럼 ㅠㅠㅠㅠㅠd1 d2인덱스 값을 신경 쓰지 않으면 재설정하거나 무시할 수 있습니다.

                      |  pd.concat(             |  pd.concat(
                      |      [d1, d2],          |      [d1, d2]
 pd.concat([d1, d2])  |      ignore_index=True) |  ).reset_index(drop=True)
--------------------- | ----------------------- | -------------------------
     A    B    C    D |      A    B    C    D   |      A    B    C    D
2  0.1  0.2  0.3  NaN | 0  0.1  0.2  0.3  NaN   | 0  0.1  0.2  0.3  NaN
3  0.1  0.2  0.3  NaN | 1  0.1  0.2  0.3  NaN   | 1  0.1  0.2  0.3  NaN
1  NaN  0.4  0.5  0.6 | 2  NaN  0.4  0.5  0.6   | 2  NaN  0.4  0.5  0.6
2  NaN  0.4  0.5  0.6 | 3  NaN  0.4  0.5  0.6   | 3  NaN  0.4  0.5  0.6

그고사 때할용을 때.axis=1:

                                   |     pd.concat(
                                   |         [d1, d2], axis=1,
 pd.concat([d1, d2], axis=1)       |         ignore_index=True)
-------------------------------    |    -------------------------------
     A    B    C    B    C    D    |         0    1    2    3    4    5
1  NaN  NaN  NaN  0.4  0.5  0.6    |    1  NaN  NaN  NaN  0.4  0.5  0.6
2  0.1  0.2  0.3  0.4  0.5  0.6    |    2  0.1  0.2  0.3  0.4  0.5  0.6
3  0.1  0.2  0.3  NaN  NaN  NaN    |    3  0.1  0.2  0.3  NaN  NaN  NaN

keys

해당 MultiIndex에 튜플 또는 스칼라 값을 할당하기 위해 스칼라 값 또는 튜플 목록을 전달할 수 있습니다.전달된 목록의 길이는 연결할 항목 수와 같아야 합니다.

: 시퀀스, 기본값 없음
여러 수준을 통과한 경우 튜플을 포함해야 합니다.합니다.

axis=0

를 할 때Series 물는건옆에 있는 .axis=0(인덱스 표시).

은, 그키은새초수기의의 이 됩니다.MultiIndex개체가 인덱스 속성에 있습니다.

 #           length 3             length 3           #         length 2        length 2
 #          /--------\         /-----------\         #          /----\         /------\
 pd.concat([s1, s2, s3], keys=['A', 'B', 'C'])       pd.concat([s1, s2], keys=['A', 'B'])
----------------------------------------------      -------------------------------------
A  2    1                                           A  2    1
   3    2                                              3    2
B  1    3                                           B  1    3
   2    4                                              2    4
C  1    5                                           dtype: int64
   3    6
dtype: int64

하지만, 우리는 스칼라 값 이상을 사용할 수 있습니다.keys 더 을 만들기 .MultiIndex자, 지나가겠습니다.tuples길이 2의 추가 a의 두 개의 새로운 레벨.MultiIndex:

 pd.concat(
     [s1, s2, s3],
     keys=[('A', 'X'), ('A', 'Y'), ('B', 'X')])
-----------------------------------------------
A  X  2    1
      3    2
   Y  1    3
      2    4
B  X  1    5
      3    6
dtype: int64

axis=1

열을 따라 확장할 때 약간 다릅니다.가 용할때를 했을 때.axis=0) (으)의 (으)는keys의 역할을 한MultiIndex기존 인덱스에 추가된 수준.axis=1우리는 축을 언급하고 있습니다.Series것, 즉 는가있않습다니즉지지물, 체고,▁don▁objects,즉▁have.columns기여하다.

Variations of Two Series wtih axis=1

이름을 지정합니다.s1그리고.s2 keys통과되지만 다음과 같은 경우 오버라이드됩니다.keys통과했습니다.

               |                       |                        |  pd.concat(
               |  pd.concat(           |  pd.concat(            |      [s1.rename('U'),
 pd.concat(    |      [s1, s2],        |      [s1.rename('U'),  |       s2.rename('V')],
     [s1, s2], |      axis=1,          |       s2.rename('V')], |       axis=1,
     axis=1)   |      keys=['X', 'Y']) |       axis=1)          |       keys=['X', 'Y'])
-------------- | --------------------- | ---------------------- | ----------------------
     0    1    |      X    Y           |      U    V            |      X    Y
1  NaN  3.0    | 1  NaN  3.0           | 1  NaN  3.0            | 1  NaN  3.0
2  1.0  4.0    | 2  1.0  4.0           | 2  1.0  4.0            | 2  1.0  4.0
3  2.0  NaN    | 3  2.0  NaN           | 3  2.0  NaN            | 3  2.0  NaN
MultiIndex with Series and axis=1
 pd.concat(
     [s1, s2],
     axis=1,
     keys=[('W', 'X'), ('W', 'Y')])
-----------------------------------
     W
     X    Y
1  NaN  3.0
2  1.0  4.0
3  2.0  NaN
Two DataFrame with axis=1

그것과 마찬가지로.axis=0 예,keys레을추니다합에 합니다.MultiIndex에는 로.columns기여하다.

 pd.concat(                     |  pd.concat(
     [d1, d2],                  |      [d1, d2],
     axis=1,                    |      axis=1,
     keys=['X', 'Y'])           |      keys=[('First', 'X'), ('Second', 'X')])
------------------------------- | --------------------------------------------
     X              Y           |   First           Second
     A    B    C    B    C    D |       X                X
1  NaN  NaN  NaN  0.4  0.5  0.6 |       A    B    C      B    C    D
2  0.1  0.2  0.3  0.4  0.5  0.6 | 1   NaN  NaN  NaN    0.4  0.5  0.6
3  0.1  0.2  0.3  NaN  NaN  NaN | 2   0.1  0.2  0.3    0.4  0.5  0.6
                                | 3   0.1  0.2  0.3    NaN  NaN  NaN
Series and DataFrame with axis=1

이거 까다롭네요.이 경우 스칼라 키 값은 다음에 대한 유일한 인덱스 수준으로 작동할 수 없습니다.Series 번 수준 역 할 하 을 는 되 었 을 때 객 체 열 이 동 안 째 의 ▁when ▁while ▁object ▁it ▁column ▁a ▁of 객 체 ▁also ▁as 때 ▁level ▁acting ▁becomes ▁the ▁first ▁a 을 첫 번 었 되MultiIndex를해위를 .DataFrame그래서 판다들은 다시 사용할 것입니다.nameSeries개체를 열 이름의 원본으로 지정합니다.

 pd.concat(           |  pd.concat(
     [s1, d1],        |      [s1.rename('Z'), d1],
     axis=1,          |      axis=1,
     keys=['X', 'Y']) |      keys=['X', 'Y'])
--------------------- | --------------------------
   X    Y             |    X    Y
   0    A    B    C   |    Z    A    B    C
2  1  0.1  0.2  0.3   | 2  1  0.1  0.2  0.3
3  2  0.1  0.2  0.3   | 3  2  0.1  0.2  0.3
Limitations of keys and MultiIndex inferrence.

판다들은 단지 열 이름들을 유추하는 것 같습니다.Series이름입니다. 그러나 열 수준 수가 다른 데이터 프레임 간에 유사한 연결을 수행할 때 빈칸을 채우지 않습니다.

d1_ = pd.concat(
    [d1], axis=1,
    keys=['One'])
d1_

   One
     A    B    C
2  0.1  0.2  0.3
3  0.1  0.2  0.3

그런 다음 이것을 열에 하나의 레벨만 있는 다른 데이터 프레임과 연결하면 Pandas는 튜플을 만드는 것을 거부할 것입니다.MultiIndex개체, 스칼라 및 튜플의 단일 수준처럼 모든 데이터 프레임을 개체 및 결합할 수 있습니다.

pd.concat([d1_, d2], axis=1)

   (One, A)  (One, B)  (One, C)    B    C    D
1       NaN       NaN       NaN  0.4  0.5  0.6
2       0.1       0.2       0.3  0.4  0.5  0.6
3       0.1       0.2       0.3  NaN  NaN  NaN

통과dict신에대 list

사전을 건네줄 때,pandas.concat의 키를 "" " " "로합니다.keys 명령어

 # axis=0               |  # axis=1
 pd.concat(             |  pd.concat(
     {0: d1, 1: d2})    |      {0: d1, 1: d2}, axis=1)
----------------------- | -------------------------------
       A    B    C    D |      0              1
0 2  0.1  0.2  0.3  NaN |      A    B    C    B    C    D
  3  0.1  0.2  0.3  NaN | 1  NaN  NaN  NaN  0.4  0.5  0.6
1 1  NaN  0.4  0.5  0.6 | 2  0.1  0.2  0.3  0.4  0.5  0.6
  2  NaN  0.4  0.5  0.6 | 3  0.1  0.2  0.3  NaN  NaN  NaN

levels

은 이기은다함사용다니됩께능기과음능▁the다▁with▁used▁in와 함께 사용됩니다.keys논쟁.언제levels인 " 의기값유니다됩지로으본다니"로 유지됩니다.None판다는 결과의 각 수준의 고유한 값을 취할 것입니다.MultiIndex그리고 그것을 결과에 사용된 물체로 사용합니다.index.levels기여하다.

수준: 시퀀스 목록, 기본값 없음
다중 인덱스를 구성하는 데 사용할 특정 수준(고유 값)입니다.그렇지 않으면 키에서 유추됩니다.

만약 판다들이 이미 이러한 수준이 무엇인지 추측한다면, 우리가 그것을 명시할 수 있는 어떤 이점이 있을까요?한 가지 예를 보여드리고 여러분이 이 방법이 유용한 다른 이유를 생각해 보도록 하겠습니다.

설서에따면르명,면,levels인수는 시퀀스 목록입니다.이것은 우리가 다른 것을 사용할 수 있다는 것을 의미합니다.pandas.Index그 결과 중 하나로.

프레임을 합니다.df은 그이연것입다니된결것의 입니다.d1,d2그리고.d3:

df = pd.concat(
    [d1, d2, d3], axis=1,
    keys=['First', 'Second', 'Fourth'])

df

  First           Second           Fourth
      A    B    C      B    C    D      A    B    D
1   NaN  NaN  NaN    0.4  0.5  0.6    0.7  0.8  0.9
2   0.1  0.2  0.3    0.4  0.5  0.6    NaN  NaN  NaN
3   0.1  0.2  0.3    NaN  NaN  NaN    0.7  0.8  0.9

열 개체의 수준은 다음과 같습니다.

print(df, *df.columns.levels, sep='\n')

Index(['First', 'Second', 'Fourth'], dtype='object')
Index(['A', 'B', 'C', 'D'], dtype='object')

사용할 경우sum에.groupby다음을 확인:

df.groupby(axis=1, level=0).sum()

   First  Fourth  Second
1    0.0     2.4     1.5
2    0.6     0.0     1.5
3    0.6     2.4     0.0

하지만 만약에 대신에['First', 'Second', 'Fourth']이름이 지정된 다른 누락된 범주가 있습니다.Third그리고.Fifth그리고 나는 그것들이 그 결과에 포함되기를 원했습니다.groupby집계?만약 우리가 그것을 가지고 있다면 우리는 이것을 할 수 있습니다.pandas.CategoricalIndex 리고우그미지수있정다습니할리것을로 지정할 수 .levels논쟁.

그래서 대신에, 정의해 봅시다.df다음과 같이:

cats = ['First', 'Second', 'Third', 'Fourth', 'Fifth']
lvl = pd.CategoricalIndex(cats, categories=cats, ordered=True)

df = pd.concat(
    [d1, d2, d3], axis=1,
    keys=['First', 'Second', 'Fourth'],
    levels=[lvl]
)

df

   First  Fourth  Second
1    0.0     2.4     1.5
2    0.6     0.0     1.5
3    0.6     2.4     0.0

그러나 열 개체의 첫 번째 수준은 다음과 같습니다.

df.columns.levels[0]

CategoricalIndex(
    ['First', 'Second', 'Third', 'Fourth', 'Fifth'],
    categories=['First', 'Second', 'Third', 'Fourth', 'Fifth'],
    ordered=True, dtype='category')

그리고 우리의groupby합계는 다음과 같습니다.

df.groupby(axis=1, level=0).sum()

   First  Second  Third  Fourth  Fifth
1    0.0     1.5    0.0     2.4    0.0
2    0.6     1.5    0.0     0.0    0.0
3    0.6     0.0    0.0     2.4    0.0

names

결과의 수준 이름을 지정하는 데 사용됩니다.MultiIndexnames는 결과적으로 된 목은결수일합니의 .MultiIndex.

이름: 목록, 기본값 없음
된 계층형 의

 # axis=0                     |  # axis=1
 pd.concat(                   |  pd.concat(
     [d1, d2],                |      [d1, d2],
     keys=[0, 1],             |      axis=1, keys=[0, 1],
     names=['lvl0', 'lvl1'])  |      names=['lvl0', 'lvl1'])
----------------------------- | ----------------------------------
             A    B    C    D | lvl0    0              1
lvl0 lvl1                     | lvl1    A    B    C    B    C    D
0    2     0.1  0.2  0.3  NaN | 1     NaN  NaN  NaN  0.4  0.5  0.6
     3     0.1  0.2  0.3  NaN | 2     0.1  0.2  0.3  0.4  0.5  0.6
1    1     NaN  0.4  0.5  0.6 | 3     0.1  0.2  0.3  NaN  NaN  NaN
     2     NaN  0.4  0.5  0.6 |

verify_integrity

자체 설명 문서

verify_integrity: 부울, 기본값 False
연결된 새 축에 중복 항목이 있는지 확인합니다.이는 실제 데이터 연결에 비해 매우 비용이 많이 들 수 있습니다.

연결된 인덱스가 생성되기 때문입니다.d1그리고.d2고유하지 않습니다. 무결성 검사에 실패합니다.

pd.concat([d1, d2])

     A    B    C    D
2  0.1  0.2  0.3  NaN
3  0.1  0.2  0.3  NaN
1  NaN  0.4  0.5  0.6
2  NaN  0.4  0.5  0.6

그리고.

pd.concat([d1, d2], verify_integrity=True)

> ValueError:인덱스에 겹치는 값이 있습니다. [2]

언급URL : https://stackoverflow.com/questions/49620538/what-are-the-levels-keys-and-names-arguments-for-in-pandas-concat-functio