首页 > 解决方案 > 在 for 循环中将数据分配给现有列

问题描述

我想使用 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),但是这样做需要很多小时。我该如何解决这个问题?

标签: pythonpandasdataframe

解决方案


使用 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)

推荐阅读