Python 如何简单地将列级别添加到数据帧
假设我有一个数据框,看起来像这样:Python 如何简单地将列级别添加到数据帧,python,pandas,dataframe,multi-level,Python,Pandas,Dataframe,Multi Level,假设我有一个数据框,看起来像这样: 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
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
我看到过这样的一个wser,但它使用不同的数据帧,而不是向已经存在的数据帧添加列级别
-正如@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设置索引
和T
df.T.set_index(np.repeat('C', df.shape[1]), append=True).T
选项2pd.concat
,键
,和swaplevel
pd.concat([df], axis=1, keys=['C']).swaplevel(0, 1, 1)
多索引的另一种方法(appanding
'E'
):
这是一种将名称添加到新级别的解决方案,它比已经给出的其他答案更容易让人眼前一亮:
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
这很好,我喜欢
pd.MultiIndex.from_product([df.columns,['C']])
,这是一个更简单的问题,因为您不必跟踪df.columns
的len
。“你介意把它加到答案里,这样我就可以接受了吗?”史蒂文:太好了,我不知道这个把戏。谢谢,我学到了一些新东西:-)当原始df已经有多索引列名时,你有什么建议,如何添加另一个级别?我试图用from_product()方法添加新的级别,但是我收到了以下错误消息:“NotImplementedError:没有为多索引定义isnull”。@LenkaVranápd.MultiIndex.from_product(df.columns.levels+['C']])
,适用于任何人。我发现在将现有列索引用于MultiIndex.from_产品之前,先将其强制转换为list,然后再将其用于“isna未实现”pd.MultiIndex.from_product([list(df.columns),['C']])
感谢您不知道swap,这很方便。我对它进行了一个大数据帧测试,看看它是否比设置pd.MultiIndex.from_product([df.columns,['C']])
更有效,速度大约慢了25%。这并不奇怪!罗曼的回答更快。我添加这个是因为我认为知道它很有价值。pd.concat([df],axis=1,keys=['C'])
对于多级列非常有效。对于一般情况,当df.columns
可以是pd.MultiIndex
时,选项2应该是可接受的答案。pd.concat
答案很好,因为它不修改原始df。较短的版本:df.columns=pd.MultiIndex.from_tuples([(c[0],'E',c[1])对于df.columns中的c)来说,
这很短,而且也适用于已经是多级的列!作为一行:df.assign(newlevel='C')。set_index('newlevel',append=True)。unstack('newlevel')
。
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