Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何简单地将列级别添加到数据帧_Python_Pandas_Dataframe_Multi Level - Fatal编程技术网

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
选项2
pd.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