pandas 系列上的循环
For loop on pandas Series
我正在尝试在 pandas 系列的列表中实现包含 for 循环的代码:
a = pd.Series(dtype= 'float64')
b = pd.Series(dtype= 'float64')
c = pd.Series(dtype= 'float64')
data = [a,b,c]
for k in data:
if len(k) < 1:
k = k.append(pd.Series([1,2]))
print(a)
# returns: Series([], dtype: float64)
我认为 print(a) 会 return 包含 [1,2] 的附加系列。但它只是 returned 了我最初定义的原始空系列。当然,打印 b 和 c 也 return 一个空系列。同时,如果我直接执行追加而不是使用 for 循环:
a = pd.Series(dtype= 'float64')
a = a.append(pd.Series([1,2]))
print(a)
# returns:
0 1
1 2
dtype: int64
所以后一种方法 returns 附加系列就好了。为什么这对前一种方法不起作用?我希望第一种方法 return 与第二种方法中的结果相同。我认为局部特性只适用于定义函数,不适用于循环。我在这里遗漏了什么吗?
当您使用 append
(以及 Pandas 的几乎所有方法)时,您将获得该系列的“副本”。修改不到位
调试 id
:
print(f"a: {id(a)}, {id(data[0])}")
for k in data:
print(f"k before: {id(k)}")
if len(k) < 1:
k = k.append(pd.Series([1,2]))
print(f"k after: {id(k)}")
break
输出:
a: 140711220977520, 140711220977520
k before: 140711220977520
k after: 140710157071840 # <- not data[0], not 'a'
更新
One last question, then would the for loop work fine in terms of memory allocation for other objects (besides pandas objects such as Series) where the method doesn't create a new copy of the original variable?
如果数据包含像列表这样的可变对象,它会起作用:
a = []
b = []
c = []
data = [a, b, c]
for k in data:
if len(k) < 1:
k.append([1, 2])
输出:
>>> a
[[1, 2]]
我正在尝试在 pandas 系列的列表中实现包含 for 循环的代码:
a = pd.Series(dtype= 'float64')
b = pd.Series(dtype= 'float64')
c = pd.Series(dtype= 'float64')
data = [a,b,c]
for k in data:
if len(k) < 1:
k = k.append(pd.Series([1,2]))
print(a)
# returns: Series([], dtype: float64)
我认为 print(a) 会 return 包含 [1,2] 的附加系列。但它只是 returned 了我最初定义的原始空系列。当然,打印 b 和 c 也 return 一个空系列。同时,如果我直接执行追加而不是使用 for 循环:
a = pd.Series(dtype= 'float64')
a = a.append(pd.Series([1,2]))
print(a)
# returns:
0 1
1 2
dtype: int64
所以后一种方法 returns 附加系列就好了。为什么这对前一种方法不起作用?我希望第一种方法 return 与第二种方法中的结果相同。我认为局部特性只适用于定义函数,不适用于循环。我在这里遗漏了什么吗?
当您使用 append
(以及 Pandas 的几乎所有方法)时,您将获得该系列的“副本”。修改不到位
调试 id
:
print(f"a: {id(a)}, {id(data[0])}")
for k in data:
print(f"k before: {id(k)}")
if len(k) < 1:
k = k.append(pd.Series([1,2]))
print(f"k after: {id(k)}")
break
输出:
a: 140711220977520, 140711220977520
k before: 140711220977520
k after: 140710157071840 # <- not data[0], not 'a'
更新
One last question, then would the for loop work fine in terms of memory allocation for other objects (besides pandas objects such as Series) where the method doesn't create a new copy of the original variable?
如果数据包含像列表这样的可变对象,它会起作用:
a = []
b = []
c = []
data = [a, b, c]
for k in data:
if len(k) < 1:
k.append([1, 2])
输出:
>>> a
[[1, 2]]