PANDAS:修剪多个数据帧

时间:2013-03-30 00:19:39

标签: python for-loop pandas

我想从几个数据框中删除行,这样它们的长度都是n。当我尝试使用-for-loop时,更改将不会在脚本的其余部分中持续存在。

n = 50
groups = [df1, df2, df3]
for dataset in groups:
    dataset = dataset[:n]

单独重新定义名称(例如,df1 = df1 [:n])有效,但有哪些替代方法? (通过python或pandas)

更重要的是,为什么-for-loop在这里不起作用?

pandas == 0.10.1 python == 2.7.3

3 个答案:

答案 0 :(得分:2)

这是一个轻微的python误解,而不是与pandas特定的一个。 :)

您正在重新分配迭代中使用的变量,而不是在列表中更改它:

In [1]: L = [1, 2, 3]

In [2]: for i in L:
            i = i + 1

In [3]: L
Out[3]: [1, 2, 3]

您想要实际更改列表:

In [4]: for i in range(len(L)):
            L[i] = L[i] + 1

In [5]: L
Out[5]: [2, 3, 4]

或许在更好的语法中使用enumerate

In [6]: for i, x in enumerate(L):
            L[i] = x + 1     

In [7]: L
Out[7]: [3, 4, 5]

那是:

for i, dataset in enumerate(groups):
    groups[i] = dataset[:n]

答案 1 :(得分:1)

n = 50
groups = [df1, df2, df3]
groups = [df.head(n) for df in groups]

在Python中,您可以将变量名称视为指向对象。 声明

groups = [df1, df2, df3]

使变量名groups指向列表对象,其中包含3个其他对象。

for-loop

for dataset in groups:

创建一个新的变量名dataset,其中指向groups内的对象,当Python迭代循环时,一次一个。

作业

dataset = dataset[:n]

重定向变量名称dataset以指向新对象dataset[:n]。但此作业不会影响groups。该变量名仍指向list对象,该对象包含原始DataFrame。

要影响groups,您需要为groups指定一个新值作为赋值语句,例如

groups = ...

或为列表中的一个元素指定新值:

groups[i] = ...

答案 2 :(得分:0)

您的代码在for循环中创建(并丢弃)新变量dataset

试试这个:

n = 50
groups = [df1, df2, df3]
for dataset in groups:
    dataset[:] = dataset[:n]