我正在尝试向量化一个循环,该循环基于另一个数据帧(df_override)中的值替换一个数据帧(df)中的值。对于df_override中的每一行,我们在df中找到匹配的“名称”列,并将其“字段”列替换为在“新值”中指定的新值。如果name是一个整数,则有一个if语句与另一列匹配。
我写了两个循环来做到这一点。但是,目标是尽可能提高性能。旧的由于使用迭代而速度较慢,因此我继续进行np循环。我希望对这个循环进行矢量化处理,以进一步缩短运行时间,但是我不知道如何进行。
旧循环(慢)
for index, row in df_override.iterrows():
if(not str(row["name"]).isdigit()):
df.loc[df["name"] == row["name"], row["Field"]] = row["New Value"]
else:
df.loc[df["id"] == row["name"], row["Field"]] = row["New Value"]
新循环(更快)
fields = df_override["Field"].values
names = df_override["name"].values
values = df_override["New Value"].values
for field, name, value in zip(fields, names, values):
if not str(name).isdigit():
df[field] = np.where(df["name"] == name, df[field], value)
else:
df[field] = np.where(df["id"] == name, df[field], value)
无效(由于进行了比较,并且字段选择似乎未按预期工作)
fields = df_override["Field"].values
names = df_override["name"].values
values = df_override["New Value"].values
#Trying without the if statement here
df[fields] = np.where(df["name"] == names, df[fields], values)
样本数据
df_override
"name" "Field" "New Value"
apple color red
100 is_number True
df
"name" "id" "color" "is_number"
apple 300 blue False
apple 200 yellow False
banana 100 green False
df (after processing)
"name" "id" "color" "is_number"
apple 300 red False
apple 200 red False
banana 100 green True