在Pandas DataFrame对象中重新定义索引

nit*_*tin 81 python dataframe pandas

我试图重新索引一个pandas DataFrame对象,就像这样,

From:
            a   b   c
        0   1   2   3
        1  10  11  12
        2  20  21  22

To :
           b   c
       1   2   3
      10  11  12
      20  21  22
Run Code Online (Sandbox Code Playgroud)

我正在解决这个问题,如下所示,我得到了错误的答案.关于如何做到这一点的任何线索?

>>> col = ['a','b','c']
>>> data = DataFrame([[1,2,3],[10,11,12],[20,21,22]],columns=col)
>>> data
    a   b   c
0   1   2   3
1  10  11  12
2  20  21  22
>>> idx2 = data.a.values
>>> idx2
array([ 1, 10, 20], dtype=int64)
>>> data2 = DataFrame(data,index=idx2,columns=col[1:])
>>> data2
     b   c
1   11  12
10 NaN NaN
20 NaN NaN
Run Code Online (Sandbox Code Playgroud)

知道为什么会这样吗?

Ava*_*ris 187

你为什么不简单地使用set_index方法?

In : col = ['a','b','c']

In : data = DataFrame([[1,2,3],[10,11,12],[20,21,22]],columns=col)

In : data
Out:
    a   b   c
0   1   2   3
1  10  11  12
2  20  21  22

In : data2 = data.set_index('a')

In : data2
Out:
     b   c
a
1    2   3
10  11  12
20  21  22
Run Code Online (Sandbox Code Playgroud)

  • 为了删除索引名称,如原始示例中所示:data2.index.name = None (17认同)

小智 5

如果你不想在索引中使用'a'

在:

col = ['a','b','c']

data = DataFrame([[1,2,3],[10,11,12],[20,21,22]],columns=col)

data
Run Code Online (Sandbox Code Playgroud)

日期:

    a   b   c
0   1   2   3
1  10  11  12
2  20  21  22
Run Code Online (Sandbox Code Playgroud)

在:

data2 = data.set_index('a')
Run Code Online (Sandbox Code Playgroud)

日期:

     b   c
a
1    2   3
10  11  12
20  21  22
Run Code Online (Sandbox Code Playgroud)

在:

data2.index.name = None
Run Code Online (Sandbox Code Playgroud)

日期:

     b   c
 1   2   3
10  11  12
20  21  22
Run Code Online (Sandbox Code Playgroud)