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

这很好地完成了工作。(我知道你不应该在循环中编辑dataFrame…)然而,我想知道我能做得更好,因为整个循环已经在父循环内。

问题是我只想编辑返回子集的第一行而不是整个子集。这就是为什么"中断"的原因。在循环内。

我已经试着做了以下事情:

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]

我认为@Serge Ballesta的答案是足够的,但只有在索引排序的情况下。

如果不是这样,我建议

condition = (df.loc[:,3] == condition_a) & (df.loc[:,4] == condition_b)
ix = df[condition].index[0]
df.loc[ix, 0] = value_1
df.loc[ix, 1] = value_2

也可以使用字符串而不是整数作为列名,以避免与索引混淆

最新更新