如何简单地将列级别添加到 pandas 数据框
How to simply add a column level to a pandas dataframe
假设我有一个如下所示的数据框:
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
Asumming 这个数据框已经存在,我怎样才能简单地添加一个级别 'C' 到列索引所以我得到这个:
df
Out[92]:
A B
C C
a 0 0
b 1 1
c 2 2
d 3 3
e 4 4
我看到这样的 SO anwser python/pandas: how to combine two dataframes into one with hierarchical column index? 但是这个连接不同的数据框而不是将列级别添加到已经存在的数据框。
-
根据@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)
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
一个解决方案,它为新的级别添加了一个名称,并且比已经提供的其他答案更容易理解:
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
)和chain-friendly(.set_axis
):
df.set_axis(pd.MultiIndex.from_product([df.columns, ['C']]), axis=1)
这在合并具有不同列级别编号的 DataFrames 时特别方便,其中 Pandas (1.4.2) 引发 FutureWarning (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
假设我有一个如下所示的数据框:
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
Asumming 这个数据框已经存在,我怎样才能简单地添加一个级别 'C' 到列索引所以我得到这个:
df
Out[92]:
A B
C C
a 0 0
b 1 1
c 2 2
d 3 3
e 4 4
我看到这样的 SO anwser python/pandas: how to combine two dataframes into one with hierarchical column index? 但是这个连接不同的数据框而不是将列级别添加到已经存在的数据框。
-
根据@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)
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
一个解决方案,它为新的级别添加了一个名称,并且比已经提供的其他答案更容易理解:
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
)和chain-friendly(.set_axis
):
df.set_axis(pd.MultiIndex.from_product([df.columns, ['C']]), axis=1)
这在合并具有不同列级别编号的 DataFrames 时特别方便,其中 Pandas (1.4.2) 引发 FutureWarning (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