比较的矢量化和性能的列选择

时间:2019-05-30 18:37:25

标签: python pandas performance vectorization

我正在尝试向量化一个循环,该循环基于另一个数据帧(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

0 个答案:

没有答案