programing

팬더 데이터 프레임에 열 레벨을 간단히 추가하는 방법

newsource 2023. 10. 7. 11:00

팬더 데이터 프레임에 열 레벨을 간단히 추가하는 방법

예를 들어 다음과 같은 데이터 프레임을 가지고 있다고 가정해 보겠습니다.

df = pd.DataFrame(index=list('abcde'), data={'A': range(5), 'B': range(5)})
 df
Out[92]: 
   A  B
a  0  0
b  1  1
c  2  2
d  3  3
e  4  4

이 데이터 프레임이 이미 존재한다고 가정할 때 열 인덱스에 레벨 'C'를 간단히 추가하면 다음을 얻을 수 있습니다.

 df
Out[92]: 
   A  B
   C  C
a  0  0
b  1  1
c  2  2
d  3  3
e  4  4

저는 이 python/pandas와 같은 SO 응답자를 보았습니다: 계층적인덱스를 가진 두 개의 데이터 프레임을 하나로 결합하는 방법. 그러나 이는 이미 존재하는 데이터 프레임에 열 레벨을 추가하는 대신 다른 데이터 프레임을 포함합니다.

-

@StevenG 본인이 제안한 것처럼, 더 나은 대답:

df.columns = pd.MultiIndex.from_product([df.columns, ['C']])

print(df)
#    A  B
#    C  C
# a  0  0
# b  1  1
# c  2  2
# d  3  3
# e  4  4

옵션1
set_index그리고.T

df.T.set_index(np.repeat('C', df.shape[1]), append=True).T

옵션2
pd.concat,keys,그리고.swaplevel

pd.concat([df], axis=1, keys=['C']).swaplevel(0, 1, 1)

enter image description here

새로운 레벨에 이름을 추가하고 이미 제시된 다른 답변보다 눈에 쉽게 띄는 솔루션:

df['newlevel'] = 'C'
df = df.set_index('newlevel', append=True).unstack('newlevel')

print(df)
#           A  B
# newlevel  C  C
# a         0  0
# b         1  1
# c         2  2
# d         3  3
# e         4  4

다음과 같이 열을 지정할 수 있습니다.

>>> df.columns = [df.columns, ['C', 'C']]
>>> df
   A  B
   C  C
a  0  0
b  1  1
c  2  2
d  3  3
e  4  4
>>> 

또는 알 수 없는 길이의 열의 경우:

>>> df.columns = [df.columns.get_level_values(0), np.repeat('C', df.shape[1])]
>>> df
   A  B
   C  C
a  0  0
b  1  1
c  2  2
d  3  3
e  4  4
>>> 

MultiIndex의 또 다른 방법(추가)'E'):

df.columns = pd.MultiIndex.from_tuples(map(lambda x: (x[0], 'E', x[1]), df.columns))

   A  B
   E  E
   C  D
a  0  0
b  1  1
c  2  2
d  3  3
e  4  4

명시적인 것이 좋습니다(사용)MultiIndex) 및 체인 친화적(.set_axis):

df.set_axis(pd.MultiIndex.from_product([df.columns, ['C']]), axis=1)

이 기능은 Panda(1.4.2)가 미래 경고()를 표시하는 열 수준 번호가 다른 DataFrame을 병합할 때 특히 유용합니다.FutureWarning: merging between different levels is deprecated and will be removed ... ):

import pandas as pd

df1 = pd.DataFrame(index=list('abcde'), data={'A': range(5), 'B': range(5)})
df2 = pd.DataFrame(index=list('abcde'), data=range(10, 15), columns=pd.MultiIndex.from_tuples([("C", "x")]))

# df1:
   A  B
a  0  0
b  1  1

# df2:
    C
    x
a  10
b  11

# merge while giving df1 another column level:
pd.merge(df1.set_axis(pd.MultiIndex.from_product([df1.columns, ['']]), axis=1),
         df2, 
         left_index=True, right_index=True)

# result:
   A  B   C
          x
a  0  0  10
b  1  1  11


또 다른 방법이지만, 투플의 목록 이해를 판다의 주장으로 사용합니다.MultiIndex.from_tuples():

df.columns = pd.MultiIndex.from_tuples([(col, 'C') for col in df.columns])

df
   A  B
   C  C
a  0  0
b  1  1
c  2  2
d  3  3
e  4  4

이것을 위한 전용 기능이 있습니다.우아함은 덜하지만 유연합니다.장점:

  • 자동으로 처리합니다.Index그리고.MultiIndex
  • 이름을 지정할 수 있습니다.
  • 여러 레벨을 한 번에 추가할 수 있습니다.
  • 위치 선택(위 또는 아래)

안부 전합니다.

def addLevel(index, value='', name=None, n=1, onTop=False):
    """Add extra dummy levels to index"""
    assert isinstance(index, (pd.MultiIndex, pd.Index))
    xar = np.array(index.tolist()).transpose()
    names = index.names if isinstance(index, pd.MultiIndex) else [index.name]
    addValues = np.full(shape=(n, xar.shape[-1]), fill_value=value)
    addName = [name] * n

    if onTop:
        names = addName + names
        xar = np.vstack([addValues, xar])
    else:
        names = names + addName
        xar = np.vstack([xar, addValues])

    return pd.MultiIndex.from_arrays(xar, names=names)
    
df = pd.DataFrame(index=list('abc'), data={'A': range(3), 'B': range(3)})
df.columns = addLevel(df.columns, value='C')
df.columns = addLevel(df.columns, value='D', name='D-name')
df.columns = addLevel(df.columns, value='E2', n=2)
df.columns = addLevel(df.columns, value='Top', name='OnTop', onTop=True)
df.columns = addLevel(df.columns, value=1, name='Number')
print(df)
## OnTop  Top   
##          A  B
##          C  C
## D-name   D  D
##         E2 E2
##         E2 E2
## Number   1  1
## a        0  0
## b        1  1
## c        2  2

언급URL : https://stackoverflow.com/questions/40225683/how-to-simply-add-a-column-level-to-a-pandas-dataframe