我想从几个数据框中删除行,这样它们的长度都是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
答案 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]