python - 在数据框中的其他列上使用应用函数的新列

标签 python pandas apply

我有一个数据框,其中三列是数据坐标(“H_x”、“H_y”和“H_z”)。我想计算数据的半径向量并将其添加为数据框中的新列。但我对 pandas apply 功能有一些问题。 我的代码是:

def radvec(x, y, z):
    rv=np.sqrt(x**2+y**2+z**2)
    return rv

halo_field['rh_field']=halo_field.apply(lambda row: radvec(row['H_x'], row['H_y'], row['H_z']), axis=1)

我收到的错误是:

group_sh.py:78: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas- 
docs/stable/indexing.html#indexing-view-versus-copy
halo_field['rh_field']=halo_field.apply(lambda row: radvec(row['H_x'], row['H_y'], row['H_z']), axis=1)

我得到了我想要的专栏,但我仍然对这个错误消息感到困惑。 我知道这里有类似的问题,但我找不到如何解决我的问题。我对 python 还很陌生。你能帮忙吗?

编辑: halo_field 是另一个数据帧的切片:

halo_field = halo_res[halo_res.N_subs==1] 

最佳答案

问题是您正在使用切片,它可能不明确:

halo_field = halo_res[halo_res.N_subs==1]

您有两个选择:

处理副本

您可以显式复制数据框以避免警告并确保原始数据框不受影响:

halo_field = halo_res[halo_res.N_subs==1].copy()
halo_field['rh_field'] = halo_field.apply(...)

有条件地处理原始数据框

使用pd.DataFrame.loc使用 bool 掩码来更新原始数据框:

mask = halo_res['N_subs'] == 1
halo_res.loc[mask, 'rh_field'] = halo_res.loc[mask, 'rh_field'].apply(...)

不要使用应用

顺便说一句,在任一情况下,您都可以避免为您的函数apply。例如:

halo_field['rh_field'] = (halo_field[['H_x', 'H_y', 'H_z']]**2).sum(1)**0.5

关于python - 在数据框中的其他列上使用应用函数的新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53033549/

相关文章:

python - pandas:跨多列搜索部分字符串并输出每行的值

python - 值错误: time data ' 1:00:00' does not match format '%H:%M:%S'

R使用combn和apply

r - 通过apply函数生成多个ggplot箱线图

python - 用两个固定长度的数字对正则表达式进行分组并删除其前导零

python - pandas.concat() 不填充列

python - sklearn 如何使用多个保存的模型合并和预测数据

python - 如何在 matplotlib 图中的特定区域上绘制矩形

python - backbone.js 在 python 中模拟模型

r - 使用 apply() 函数迭代不同的数据类型不起作用