如何为我的数据分配一个绝对新的索引而不与旧索引有任何关系?
我知道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
备注:
DataFrame
构造函数构造一个具有预分配索引的数据框。我需要完全修改一个现有的DataFrame。DataFrame.shift
可以工作-但是如果我需要分配一个任意的自定义索引,而不转移现有的自定义索引怎么办?谢谢。
答案 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])
获得所需的结果。