python - Pandas - 根据条件从返回的子集中编辑单个数据帧值,而不使用 for 循环
问题描述
正如标题所说,请考虑下面的 for 循环示例。'df' 是一个具有多行多列的数据框:
for index, row in df.iterrows():
if row[3] == condition_a and row[4] == condition_b:
df.at[index, 0] = value_1
df.at[index, 1] = value_2
break
这工作正常并且可以完成工作。(我知道您不应该在循环内编辑数据帧......)但是我想知道我能否做得更好,因为整个循环已经在父循环内。
问题是我只希望编辑返回子集的第一行,而不是整个子集。这就是循环内部的“中断”的原因。
我尝试执行以下操作:
df.loc[(df[3] == condition_a) & (df[4] == condition_b), 0].iloc[0] = value_1
# plus another line to change pos 1 to value_2
虽然这不会导致任何错误,但它也不会分配任何东西(df 中没有任何变化)。我希望避免创建一个新的临时数据框来编辑值,然后与原始 df 合并。这不会比循环慢吗?
所以问题是:可以这样做还是循环是这里唯一的解决方案?在此先感谢您的帮助!
解决方案
您可以获得满足条件的最小索引并使用它来设置新值:
ix = df[(df.iloc[:,3] == condition_a)&(df.iloc[:,4]==condition_b)].index.min()
df.loc[ix, df.columns[[0, 1]]] = [value_1, value_2]
推荐阅读
- sql - 选择单个用户的最大日期时间
- opencl - Darknet - OpenCL 在 clEnqueueNDRangeKernel 中奇怪的时间连续增量
- java - 从其第一个索引的对象数组列表中检索对象数组
- io - Rust 的标准库是否支持直接 IO 文件访问?
- amazon-web-services - 使用静态列表作为 Cloudformation 参数
- bash - 如何调试单个 shell 命令调用,准确查看参数?
- linux - 分析文本/指令段大小
- python - 如何阻止 Matplotlib 的导航工具栏缩放在绘图更新时重置?
- css - 创建自定义下拉菜单,为什么子元素的宽度比其父元素宽?
- javascript - 使用 BringToFront() 来设置不在 ngx-leaflet 图层事件中的传单图层样式