pandas 如何创建一个函数来根据python中预定义的参数删除特定的dataframe行

lmyy7pcs  于 2023-04-19  发布在  Python
关注(0)|答案(1)|浏览(136)

我有以下数据框,以研究一年内海底鱼的覆盖距离:

StartPosition           FinishPosition      PathDistance        Time           Date
(27777.9, 1944.72)    (2783.63, 1941.08)        6.72            13:28:15.56    2023-07-08
(2783.63, 1941.08)    (2790.62, 1939.07)        3.22            14:12:19.52    2023-07-08
(2790.62, 1939.07)    (2778.02, 1946.28)        5.14            14:55:17.23    2023-07-08
(2778.02, 1946.28)    (2783.53, 1943.08)        7.60            15:33:47.27    2023-07-08
(2783.53, 1943.08)    (2792.62, 1963.25)        80.21           15:59:23.51    2023-07-08
(2792.62, 1963.25)    (2785.83, 1947.77)        2.96            16:31:12.14    2023-07-08
(2785.83, 1947.77)    (2756.21, 1933.54)        5.29            18:29:13.35    2023-07-08
(2756.21, 1933.54)    (2784.73, 1996.91)        105.32          19:01:45.35    2023-07-08

在进行任何分析之前,我必须从外层过滤我的 Dataframe 。例如,分析的鱼不可能在20分钟内移动超过50米,因此应该删除这些值。
因此,我想创建一个函数来运行我的dataframe的完整性,并根据预定义的时间间隔消 debugging 误的值。例如,如果两个连续点之间的间隔时间〈15 min,PathDistance(m)〉50,我将消除整行。
类似的东西(希望不会太糟!!):

def Filtr (IntervalTime, PathDistance):
    time1 = (df.iloc[i]['Time'])
    time2 = (df.iloc[i+1]['Time'])
    IntervalTime = time2 - time1
    if(IntervalTime > 15, PathDistance < 50):
        #maintain the row
    else:
        #remove the row

对不起的脚本,但我仍然是一个初学者在python!

##################################

也许像这样的for loop更好,但我仍然错过了一些东西:

for i, row in df.iterrows():
    time1 = (df.iloc[i]['Time'])
    time2 = (df.iloc[i+1]['Time'])
    IntervalTime = time2 - time1
    PathDistance = (row['PathDistance'])
    if IntervalTime < 30 and PathDistance > 100:
        distances.drop([row])
mznpcxlj

mznpcxlj1#

为此,你可以使用df.shift(1),这将使你的数据向下移动一个,如果你想将你的数据向上移动一个,你也可以使用df.shift(-1)。一旦你这样做了,你可以使用numpy的where函数来过滤掉double条件。

import numpy as np
df['time_difference'] = df['Time'] - df['Time'].shift(1)
distance_filter = df['PathDistance'] > 50
time_filter = df['time_difference'] < '15:00:00'

df['outlier'] = np.where( distance_filter & time_filter, 1, 0)
outlier_filter = df['outlier'] != 1
df = df[ outlier_filter ]

相关问题