将数据分配给for循环中的现有列

时间:2019-08-25 13:19:49

标签: python pandas dataframe

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

1 个答案:

答案 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)