gpt4 book ai didi

python - 根据 Python Pandas 中的条件减去两行

转载 作者:行者123 更新时间:2023-11-28 20:04:06 26 4
gpt4 key购买 nike

我正在处理一个数据集,我有时间和几个人的注意力不同种类的微生物有重复,所以它只是一个时间列为了这个问题,还有一堆数字。我在测量每两个小时一次,有时我会连续测量两次,然后这些测量的时间戳彼此非常相似。对于那些相似的时间戳,我想取所有的两行的平均值列并将这些平均值返回到一个新的数据框中,其中两个值放在之前。

这是数据框的样子。时间戳已转换为数值,因为相对时间/日期无关紧要。你可以看到一个我所说的例子,有两个非常相似的时间第 9 和第 10 个索引

      Time        A1       A2       A3
0 0.000069 118.0 108.0 70.0
1 0.087049 189.0 54.0 89.0
2 0.156551 154.0 122.0 107.0
3 0.721516 129.0 148.0 148.0
4 0.789329 143.0 162.0 212.0
5 0.882743 227.0 229.0 149.0
6 0.964907 208.0 255.0 241.0
7 1.041424 200.0 241.0 222.0
8 1.731806 733.0 838.0 825.0
9 1.794340 804.0 996.0 954.0
10 1.794769 861.0 987.0 1138.0

将时间列中的数字四舍五入到一个合理的值似乎很明显,由此我可以使用 groupby() 函数(如果我真的需要对它们进行分组)和然后平均“重复”值,但我已经走上了一条新的哲学道路我想在其中使用 pandas iterrows() 函数来完成行,1 乘 1,并比较每两个连续的行并将条件应用于他们达到同样的结果。我已经到达了这样的东西,它有没有错误代码,但似乎什么也没做。

for i, row in df.iterrows():
row2 = row + 1 #I feel like this line is the crux of the problem
if row2.Time - row.Time >= 0.1:
row = (row2 + row)/2
else:
row = row

出于好奇,我很想知道哪个更快,groupby 和平均方式或 for 循环和平均方式。也许有一个漂亮的兰巴功能方式也可以做到这一点?我已经广泛搜索了这种类型的东西,我很想看看你们都能想出什么。

干杯

最佳答案

以下是一些一般性提示:

  • 比 python for 循环更喜欢矢量化计算。例如,调用 df['Time'].diff() 比在循环中计算 row2['Time'] - row1['Time'] 快得多。对于足够大的 N,矢量化计算将始终击败 for 循环计算,其中 Nfor 循环 所需的迭代次数。
  • Prefer column-based operations基于行的操作
  • 优先考虑对大型数组进行较少的操作,而不是对较小的数组进行大量操作。

作为原理的演示,请考虑这两种不同的计算所需结果的方法:

import numpy as np
import pandas as pd

df = pd.DataFrame({'A1': [118.0, 189.0, 154.0, 129.0, 143.0, 227.0, 208.0, 200.0, 733.0, 804.0, 861.0], 'A2': [108.0, 54.0, 122.0, 148.0, 162.0, 229.0, 255.0, 241.0, 838.0, 996.0, 987.0], 'A3': [70.0, 89.0, 107.0, 148.0, 212.0, 149.0, 241.0, 222.0, 825.0, 954.0, 1138.0], 'Time': [6.8999999999999997e-05, 0.087049000000000001, 0.156551, 0.72151599999999994, 0.78932899999999995, 0.88274300000000006, 0.96490699999999996, 1.0414239999999999, 1.7318060000000002, 1.79434, 1.7947689999999998]})

def using_loop(df):
for i in range(len(df)-1):
row1, row2 = df.iloc[i], df.iloc[i+1]
if row2['Time'] - row1['Time'] >= 0.1:
df.iloc[i] = (row2 + row1)/2
return df

def using_column_based_operations(df):
mask = df['Time'].diff() >= 0.1
prior = mask.shift(-1).fillna(False)
df.loc[prior] = (df.loc[mask].values+df.loc[prior].values)/2
return df

In [220]: using_loop(df).equals(using_column_based_operations(df))
Out[220]: True

这是使用 IPython 的 %%timeit 函数的基准测试,它显示 using_column_based_operationsnrows< 时比 using_loop 快数千倍 是 10**4。随着 nrows 的增加,using_column_based_operations 的速度优势增加。

In [216]: nrows, ncols = 10**4, 4

In [217]: %%timeit df = pd.DataFrame(np.random.random((nrows, ncols)), columns=['Time', 'A1', 'A2', 'A3'])
.....: using_loop(df)
.....:
1 loop, best of 3: 3.02 s per loop

In [218]: %%timeit df = pd.DataFrame(np.random.random((nrows, ncols)), columns=['Time', 'A1', 'A2', 'A3'])
.....: using_column_based_operations(df)
.....:
1000 loops, best of 3: 1.91 ms per loop

关于python - 根据 Python Pandas 中的条件减去两行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38044808/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com