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

Posted

技术标签:

【中文标题】重新定义 Pandas DataFrame 对象中的索引【英文标题】:Redefining the Index in a Pandas DataFrame object 【发布时间】:2012-05-14 12:21:26 【问题描述】:

我正在尝试重新索引 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

我将按如下所示进行此操作,但得到了错误的答案。有关如何执行此操作的任何线索?

>>> 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

知道为什么会这样吗?

【问题讨论】:

因为你正在使用第一个 DF 来构建第二个,这只会得到 idx2 与 data.index 相交的行,即。第 1 行 【参考方案1】:

你为什么不简单地使用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

【讨论】:

为了去掉索引名,如原例:data2.index.name = None【参考方案2】:

如果您不想在索引中出现“a”

在:

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

在:

data2 = data.set_index('a')

输出:

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

在:

data2.index.name = None

输出:

     b   c
 1   2   3
10  11  12
20  21  22

【讨论】:

第二个 Out 不正确。左侧还有一个未命名的列,包含 0、1、2。【参考方案3】:

为避免使用单行索引名称,您可以使用 set_index('a')rename_axis(None)

In [8]: data.set_index('a').rename_axis(None)
Out[8]: 
     b   c
1    2   3
10  11  12
20  21  22

详情

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

【讨论】:

以上是关于重新定义 Pandas DataFrame 对象中的索引的主要内容,如果未能解决你的问题,请参考以下文章

pandas.DataFrame学习系列1——定义及属性

003.pandas.DataFrame

003.pandas.DataFrame

在 pandas DataFrame 中重新排序 MultiIndex 的级别

pandas DataFrame 从不规则时间序列索引中重新采样

pandas操作Series和DataFrame的基本功能