【发布时间】:2018-05-29 23:07:03
【问题描述】:
我已经编写了下面给出的代码。有两个 Pandas 数据框:df 包含列 timestamp_milli 和 pressure,df2 包含列 timestamp_milli 和 acceleration_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