如何最小化运行时间:Pandas中的值替换迭代

时间:2019-05-29 17:18:13

标签: python pandas performance dataframe

我有一个名为df_override的数据框,其中包含“名称”,“字段”和“新值”列。此循环的目的是将df数据框的“字段”列中的所有“名称”匹配项替换为“新值”。 if语句用于查看它是否为整数,那么它将通过“ id”列进行匹配。

此循环工作正常,但数据帧较大时,它的运行速度令人难以置信。我还有其他几个for循环,它们在函数的后面都像这样运行。我想知道是否有其他方法可以执行针对运行时优化的功能?

谢谢。

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"]

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

1 个答案:

答案 0 :(得分:0)

将其更改为值而不是迭代可以提高性能,但仍然很慢。

新循环

for field, name, value in zip(df_override["Field"].values,df_override["name"].values,df_override["New Value"].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)