如何不基于以前的索引数据关系将绝对新索引设置为pandas DataFrame?

时间:2018-12-09 22:02:10

标签: python pandas dataframe

如何为我的数据分配一个绝对新的索引而不与旧索引有任何关系?

我知道reindex方法

df = pd.DataFrame({'a': [1,2,3,4], 'b': [2,3,4,5]})
df

    a   b
0   1   2
1   2   3
2   3   4
3   4   5

df.reindex([1,2,3,4])

    a   b
1   2.0 3.0
2   3.0 4.0
3   4.0 5.0
4   NaN NaN

...但是我只想修改行索引以获取

    a   b
1   1   2
2   2   3
3   3   4
4   4   5

备注:

  1. 我知道我可以使用DataFrame构造函数构造一个具有预分配索引的数据框。我需要完全修改一个现有的DataFrame。
  2. 在这种特殊情况下,DataFrame.shift可以工作-但是如果我需要分配一个任意的自定义索引,而不转移现有的自定义索引怎么办?

谢谢。

3 个答案:

答案 0 :(得分:2)

在链式方法调用中,了解一下可以使用不存在的标签调用set_index的技巧可能会很有用,只要将要设置的标签包装在另一个列表中即可。

>>> df.set_index([[1, 2, 3, 4]])
   a  b
1  1  2
2  2  3
3  3  4
4  4  5
>>>
>>> df.set_index([['w', 'x', 'y', 'z']])
   a  b
w  1  2
x  2  3
y  3  4
z  4  5

我真的不知道为什么为什么有效。看看set_index的文档,我最大的猜测是这是创建仅具有一个级别的多索引的一种特殊情况,就像文档中的最后一个例子一样

df.set_index([[1, 2, 3, 4], 'year'])

但省略第二个元素'year'

答案 1 :(得分:1)

如果集合的长度与数据帧的长度相同,则可以将任何内容传递给df.index

df.index = range(1,5)
>>> df
   a  b
1  1  2
2  2  3
3  3  4
4  4  5

df.index = ['this', 'is', 'an', 'index']
>>> df
       a  b
this   1  2
is     2  3
an     3  4
index  4  5

此外,如果只是在原始索引中添加一个的问题,则可以使用就地+运算符:

>>> df
   a  b
0  1  2
1  2  3
2  3  4
3  4  5

>>> df.index += 1

>>> df
   a  b
1  1  2
2  2  3
3  3  4
4  4  5

答案 2 :(得分:1)

要修改现有DataFrame的索引,只需执行

df.index = [1,2,3,4]

如果您想使用一种方法来执行此操作,则timgeb的答案可能是针对这种特定情况的最佳选择。另外,您可以如下定义自己的DataFrame方法。

def reindex2(self, newindex, inplace=False):
    if inplace:
        reindexed = self
    else:
        reindexed = self.copy()
    reindexed.index = newindex
    return reindexed
pd.DataFrame.reindex2 = reindex2
del reindex2

现在您可以做

df.reindex2([1,2,3,4])

获得所需的结果。