【问题标题】:Speeding up loop over dataframes加快数据帧上的循环
【发布时间】:2018-05-29 23:07:03
【问题描述】:

我已经编写了下面给出的代码。有两个 Pandas 数据框:df 包含列 timestamp_millipressuredf2 包含列 timestamp_milliacceleration_z。两个数据框都有大约 100'000 行。在下面显示的代码中,我正在搜索df 的每一行的每个时间戳df2 的行,其中时间差在一个范围内并且是最小的。

不幸的是,代码非常慢。此外,我收到来自df_temp["timestamp_milli"] = df_temp["timestamp_milli"] - row["timestamp_milli"] 行的以下消息:

SettingWithCopyWarning:试图在一个副本上设置一个值 从 DataFrame 切片。尝试使用 .loc[row_indexer,col_indexer] = 取而代之的价值

如何加快代码速度并解决警告?

acceleration = []
pressure = []

for index, row in df.iterrows():
    mask = (df2["timestamp_milli"] >= (row["timestamp_milli"] - 5)) & (df2["timestamp_milli"] <= (row["timestamp_milli"] + 5))
    df_temp = df2[mask]

    # Select closest point
    if len(df_temp) > 0:
        df_temp["timestamp_milli"] = df_temp["timestamp_milli"] - row["timestamp_milli"]
        df_temp["timestamp_milli"] = df_temp["timestamp_milli"].abs()

        df_temp = df_temp.loc[df_temp["timestamp_milli"] == df_temp["timestamp_milli"].min()]

        for index2, row2 in df_temp.iterrows():
            pressure.append(row["pressure"])
            acc = row2["acceleration_z"]
            acceleration.append(acc)

【问题讨论】:

  • 对于警告,我认为做df_temp = df2[mask].copy() 应该可以防止它
  • 如果你只想找到一个最接近的匹配,那么pandas.merge_asof可以做到这一点。如果您提供示例数据和预期输出,您可以获得一些更有针对性的帮助。
  • 对于初学者来说,省去 itterrows,它比 itertuples 慢得多...
  • 看看使用命名元组。 stackoverflow.com/a/47149876/6361531

标签: python performance pandas dataframe


【解决方案1】:

我也遇到过类似的问题,使用 itertuples 而不是 iterrows 可以显着减少时间。 why iterrows have issues. 希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 2022-07-06
    • 2019-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    相关资源
    最近更新 更多