我想使用for循环和函数将数据分配给数据框的一列,但是我得到了常见警告:
“ SettingWithCopyWarning:试图在一个副本上设置一个值 从DataFrame切片”
我有一个数据框和三列日期(年,月和日),现在我想要一个新列,它将这三列转换为一列。
我正在使用for循环将新数据分配给新列。
如您在下面看到的,我尝试使用copy()
和deepcopy()
,但是它不起作用。
for i in range(100008):
df.new_col[i]=convert(df.year[i],df.mounth[i],df.day[i])
我尝试代替第二行:
df.new_col[i].copy()=convert(df.year[i],df.mounth[i],df.day[i])
deepcopy(df.new_col[i]) =convert(df.year[i],df.mounth[i],df.day[i])
我希望我的代码将值分配给该列,并且确实做到了(因为我中断了内核并调用了df),但是这样做需要很多小时。如何解决该问题?
答案 0 :(得分:2)
使用pandas apply方法代替for
循环,该方法要快得多。
如果我正确理解您的代码,则需要这样的内容:
df['new_col'] = df.apply(convert2, axis=1)
其中convert2
的定义如下:
def convert2(x):
return convert(x['year'], x['month'], x['day'])
这是因为,当将一个函数传递给apply
时,该函数必须将数据帧的一行或一列(在这种情况下为axis=1
开始,作为参数)。
或者,您可以使用convert2
函数来代替定义lambda
:
df['new_col'] = df.apply(lambda x : convert(x['year'], x['month'], x['day']), axis=1)