Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.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 - Fatal编程技术网

Python 是否有一个列的重置索引,或者有一种方法将列标题移动到一个内部索引,而将其索引位置作为外部索引?

Python 是否有一个列的重置索引,或者有一种方法将列标题移动到一个内部索引,而将其索引位置作为外部索引?,python,pandas,Python,Pandas,示例数据帧: df = pd.DataFrame(np.random.randint(0, 10, size=(10, 4)), columns=list('ABCD')) 有没有办法重置列的索引?或者轻松插入具有列索引位置值的行?我希望索引位置是最外层的索引,而列标题是最内层的索引。我认为您可以使用或范围: np.random.seed(10) df = pd.DataFrame(np.random.randint(0,10,size=(10, 4)), columns=list('ABCD

示例数据帧:

df = pd.DataFrame(np.random.randint(0, 10, size=(10, 4)), columns=list('ABCD'))
有没有办法重置列的索引?或者轻松插入具有列索引位置值的行?我希望索引位置是最外层的索引,而列标题是最内层的索引。

我认为您可以使用或
范围

np.random.seed(10)
df = pd.DataFrame(np.random.randint(0,10,size=(10, 4)), columns=list('ABCD'))

df.columns = np.arange(len(df.columns))
#alternatively
#df.columns = range(len(df.columns))
print (df)
   0  1  2  3
0  9  4  0  1
1  9  0  1  8
2  9  0  8  6
3  4  3  0  4
4  6  8  1  8
5  4  1  3  6
6  5  3  9  6
7  9  1  9  4
8  2  6  7  8
9  8  9  2  0
但是丢失了列值

如果需要不带姓名:

df.columns = [np.arange(len(df.columns)), df.columns]
print (df)
   0  1  2  3
   A  B  C  D
0  9  4  0  1
1  9  0  1  8
2  9  0  8  6
3  4  3  0  4
4  6  8  1  8
5  4  1  3  6
6  5  3  9  6
7  9  1  9  4
8  2  6  7  8
9  8  9  2  0
对于名称,请使用:

删除列名

df.columns=pd.RangeIndex(df.columns.size)
df
输出:

01123
#---------------#
0   0   1   3   3
1   2   2   0   2
2   2   1   3   1
3   2   1   0   0
将列名删除一行
可能存在性能问题和副作用,请参阅下面的讨论

df.T.reset_索引(drop=True).T
输出:

01123
#---------------#
0   0   1   3   3
1   2   2   0   2
2   2   1   3   1
3   2   1   0   0
实时列名作为行一行
同样的问题,见下面的讨论

df.T.reset_index().T
输出:

01123
#-------------------#
索引A B C D
0    0   1   3   3
1    2   2   0   2
2    2   1   3   1
3    2   1   0   0
实时列名为行
有效途径

#异构数据帧创建
df=pd.DataFrame(np.random.randint(0,4,size=(4,3)),columns=list('789')).join(
数据帧(列表('bcde'),列=['A']))
df.index.name='4'
#将列另存为行,然后重新索引列名
df=df.append(pd.Series(df.columns,name=df.index.name,index=df.columns),)
df.columns=pd.RangeIndex(df.columns.size)
打印(df)
打印(df.info())
输出:NB您需要额外的努力来防止所有数据的升级

01123
#-----------#
4.
0232B
110 2 c
2 3 1 3 d
3 3 2 e
4789A
索引:5个条目,0到4
数据列(共4列):
0 5非空对象
1.5非空对象
2.5非空对象
3.5非空对象
数据类型:对象(4)
将第二列索引添加一行
可能存在性能问题和副作用,请参阅下面的讨论

df.T.set\u索引(pd.RangeIndex(df.columns.size),append=True).T
输出:

A B C D
0   1   2   3
#---------------#
0   0   1   3   3
1   2   2   0   2
2   2   1   3   1
3   2   1   0   0

单线批评法 性能问题
对于大型数据集来说,双
T
的成本可能是不可接受的,但在简单的情况下,返回数据帧副本的一行可能有用。见测试结果

[294]中的
:对于范围(3,7)中的i:
…:df=pd.DataFrame(np.random.randint(0,9,size=(10**i,10**3)))
…:打印('shape:',df.shape)
…:%timeit df.T.reset_索引(drop=True)
...: 
形状:(10001000)
100个回路,最好为3:3.2 ms/回路
形状:(10000,1000)
10个回路,最佳3个:每个回路29.3毫秒
形状:(100000,1000)
1个循环,最佳3:546毫秒/循环
形状:(10000000)
1圈,最佳3圈:每圈9.9秒
在[295]中:%timeit df.columns=pd.RangeIndex(df.columns.size)
最慢的跑步比最快的跑长28.60倍。这可能意味着正在缓存中间结果。
100000个回路,最佳3个:每个回路7.74µs
副作用(向上投射)
异构数据帧将被上传

[352]中的
:df=pd.DataFrame(np.random.randint(0,4,size=(4,3)),columns=list('789')。join(
…:pd.DataFrame(列表('bcde'),列=['A']))
在[353]:df.info()中
范围索引:4个条目,0到3
数据列(共4列):
7.4非空int64
8.4非空int64
9.4非空int64
4非空对象
数据类型:int64(3),对象(1)
内存使用:208.0+字节
.T.T向上投射

[354]中的
:df.T.T.info()
范围索引:4个条目,0到3
数据列(共4列):
7.4非空对象
8.4非空对象
9.4非空对象
4非空对象
数据类型:对象(4)
内存使用:208.0+字节


当我试图设置_索引(“库存编号”)时,我遇到了关键错误,你知道我该如何回避这个事实吗?我可能需要回顾一下在使用多索引时如何设置索引,但我会问。可能列名中有一些空格,请通过print df.columns.tolist()检查,并通过df.columns=df.columns.str.strip()删除。它应该很慢,因为双重转置,您认为呢?在大多数情况下,它足够快。顺便说一句,我不确定熊猫是否会对数据执行任何操作。我会检查。谢谢,请尝试测试
1k行x 1k列
。数据帧通过将不同的数据类型分组来存储异构数据。在进行转置时,pandas必须向上转换行的数据类型。这会导致不必要的副作用,因为如果原始df有一列字符串和其他数字列,则其转置的转置将具有所有对象数据类型。在再次手动将数字转换为数字之前,您将无法执行数字操作。
names = ['a','b']
df.columns = pd.MultiIndex.from_arrays([np.arange(len(df.columns)), df.columns], names=names)
print (df)
a  0  1  2  3
b  A  B  C  D
0  9  4  0  1
1  9  0  1  8
2  9  0  8  6
3  4  3  0  4
4  6  8  1  8
5  4  1  3  6
6  5  3  9  6
7  9  1  9  4
8  2  6  7  8
9  8  9  2  0