팬더 데이터 프레임에 열 레벨을 간단히 추가하는 방법
예를 들어 다음과 같은 데이터 프레임을 가지고 있다고 가정해 보겠습니다.
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)
새로운 레벨에 이름을 추가하고 이미 제시된 다른 답변보다 눈에 쉽게 띄는 솔루션:
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
'programing' 카테고리의 다른 글
프로젝트에서 위험을 고려할 때 -I 포함 스위치를 사용하는 이유는 무엇입니까? (0) | 2023.10.07 |
---|---|
XML 문서에 HTML 내용을 삽입할 수 있습니까? (0) | 2023.10.07 |
크로스 브라우저 자바스크립트 XML 구문 분석 (0) | 2023.10.07 |
센토스 리눅스에서 mariadb를 안전하게 제거할 수 있습니까? (0) | 2023.10.07 |
Android on Click in XML vs.OnClickListener (0) | 2023.10.07 |