一次访问多个索引行时有效地迭代 pandas.DataFrame

Posted

技术标签:

【中文标题】一次访问多个索引行时有效地迭代 pandas.DataFrame【英文标题】:Iterate pandas.DataFrame efficiently while accessing more than one index row at a time 【发布时间】:2019-04-28 06:31:28 【问题描述】:

我已经阅读了有关如何高效迭代 pandas.DataFrame (https://engineering.upside.com/a-beginners-guide-to-optimizing-pandas-code-for-speed-c09ef2c6a4d6) 的答案和博客文章,但我还有一个问题。

目前,我的 DataFrame 表示包含 时间、经度和纬度列的 GPS 轨迹。 现在,我想计算一个名为 到下一个点的距离 的特征。因此,我不仅要遍历行并对单行进行操作,而且必须在单次迭代中访问后续行。

i=0
for index, row in df.iterrows():
    if i < len(df)-1:
        distance = calculate_distance([row['latitude'],row['longitude']],[df.loc[i+1,'latitude'],df.loc[i+1,'longitude']])
        row['distance'] = distance

除了这个问题,我在计算速度、应用平滑或其他类似方法时也遇到了同样的问题。

另一个例子: 我想搜索速度 == 0 m/s 的数据点并从这些点传出我想将所有后续数据点添加到一个数组中,直到速度达到 10 m/s(以查找从 0m/s 加速到 10m/ 的段s)。

您对如何尽可能高效地编写这样的代码有什么建议吗?

【问题讨论】:

使用 df 和 df.shift() 您可能希望使用 shift (***.com/questions/22081878/…) 进行调查并避免迭代 【参考方案1】:

您可以使用pd.DataFrame.shift 将移位序列添加到您的数据框,然后通过apply: 输入您的函数

def calculate_distance(row):
    # your function goes here, trivial function used for demonstration
    return sum(row[i] for i in df.columns)

df[['next_latitude', 'next_longitude']] = df[['latitude', 'longitude']].shift(-1)
df.loc[df.index[:-1], 'distance'] = df.iloc[:-1].apply(calculate_distance, axis=1)

print(df)

   latitude  longitude  next_latitude  next_longitude  distance
0         1          5            2.0             6.0      14.0
1         2          6            3.0             7.0      18.0
2         3          7            4.0             8.0      22.0
3         4          8            NaN             NaN       NaN

这适用于任意函数calculate_distance,但您的算法很可能是可向量化的,在这种情况下,您应该使用按列排列的 Pandas / NumPy 方法。

【讨论】:

谢谢,对我来说非常适合简单的功能。但我会称之为 next_latitude/longitude。

以上是关于一次访问多个索引行时有效地迭代 pandas.DataFrame的主要内容,如果未能解决你的问题,请参考以下文章

在 pandas DataFrame 中有效地搜索列表值的组合

一次迭代并访问多个地图(JavaScript)

在 for 循环中有效地打印每 x 次迭代

QDataWidgetMapper-在pyqt中查找sql​​ite数据库行的索引

如何有效地将大文件加载到 IndexedDB 存储中?我的应用程序在超过 100,000 行时崩溃

如何对聚合进行过滤以有效地使用索引?