for循环中的pandas set_index

时间:2017-01-13 00:02:25

标签: python pandas

我有很多大约这种类型的DataFrame:

import pandas as pd
import numpy as np

x1 = pd.DataFrame(np.vstack((np.random.random((3, 25)),np.arange(1,26))).T, columns = ['a', 'b', 'c', 'timestamp'])
x2 = pd.DataFrame(np.vstack((np.random.random((3, 25)),np.arange(1,26))).T, columns = ['a', 'b', 'c', 'timestamp'])
x3 = pd.DataFrame(np.vstack((np.random.random((3, 25)),np.arange(1,26))).T, columns = ['a', 'b', 'c', 'timestamp'])

如果我无法在创建DataFrame时设置索引,我想使用for循环将timestamp列一次更改为所有DataFrame的索引,如:

for x in [x1, x2, x3]:
    x = x.set_index(['timestamp'])

但是当我打电话给x1.head()时我会回来

          a         b         c  timestamp
0  0.896372  0.320966  0.601483        1.0
1  0.041191  0.398337  0.778510        2.0
2  0.807218  0.891364  0.044076        3.0
3  0.604762  0.814592  0.731940        4.0
4  0.453155  0.122674  0.287158        5.0

我是否错误地使用了set_index()或误解了如何在循环中为x分配x1,x2和x3?

1 个答案:

答案 0 :(得分:4)

您可以设置索引 inplace ,当您遍历列表时, x 只是一个临时变量,它与x1共享相同的数据,{ {1}}和x2,为临时变量分配新数据框不会更改原始数据框,您必须在原地修改数据:

x3

enter image description here

获取所需数据帧列表而不修改原始数据帧的另一种方法是使用list-comprehension:

for x in [x1, x2, x3]:
    x.set_index(['timestamp'], inplace=True)