我想在Jupyter中df["One"] = range(1,1001)
df["Two"] = range(2000, 3000)
df["Three"] = range(3000, 4000)
df.set_index(["One"], drop = True, inplace = True)
一个函数。
def test_iterrows(df):
for index, row in df.iterrows():
if (row["Three"] & 1 == 0):
df.loc[index, "Three"] = "Even"
else:
df.loc[index, "Three"] = "Odd"
print df.head()
gc.collect()
return None
test_iterrows(df)
当我运行 Two Three
One
1 2000 Even
2 2001 Odd
3 2002 Even
4 2003 Odd
5 2004 Even
时,我得到:
%timeit test_iterrows(df)
精细。该功能有效。但是,当我<ipython-input-29-326f4a0f49ee> in test_iterrows(df)
13 def test_iterrows(df):
14 for index, row in df.iterrows():
---> 15 if (row["Three"] & 1 == 0):
16 df.loc[index, "Three"] = "Even"
17 else:
TypeError: unsupported operand type(s) for &: 'str' and 'int'
时,我收到错误:
%timeit
这里发生了什么?我的(可能是错误的)解释是,我显然不能%
包含x2y2 = coordinates.pop(0)
的函数。
这里发生了什么?
答案 0 :(得分:1)
%timeit
重复执行该语句,该函数就地更改了df
。请注意,当我只调用该函数两次时,我得到了相同的异常:
test_iterrows(df)
test_iterrows(df)
# TypeError: unsupported operand type(s) for &: 'str' and 'int'
你可能应该传递一个copy
,虽然这会略微“偏向”时间,因为它也会复制它所需的时间:
%timeit test_iterrows(df.copy()) # time the execution with a copy
%timeit df.copy() # compared to the time it takes to just copy it
此外,我不太清楚gc.collect()
调用应该在那里做什么,因为gc.collect
只是垃圾收集由于参考周期而无法通过正常方式进行吞噬的对象。