根据对象的值删除数据框中行的间隔

Drop interval of rows in a dataframe based on the value of an object

我正在尝试将我的 Dataframes 中的行间隔从最大值(不包括)删除到列的其余(末尾)。这是我的 df (dflist['time']) 的列之一的示例:

0     0.000000
1     0.021528
2     0.042135
3     0.062925
4     0.083498
        ...   
88    1.796302
89    1.816918
90    1.837118
91    1.857405
92    1.878976
Name: time, Length: 93, dtype: float64

我尝试将 .iloc 和 .drop 函数与 .index 结合使用来实现此结果,但到目前为止没有任何成功:

for nested_dict in dict_all_raw.values():
    for dflist in nested_dict.values():
        v_max = dflist['velocity'].max()
        v_max_idx = dflist['velocity'].index[dflist['velocity'] == v_max]
        dflist['time'] = dflist['time'].iloc[0:[v_max_idx]]

我也尝试了几种变体,比如将 'v_max_idx' 转换为带有 .list 或 .int 的列表以更改 .iloc 函数内的类型,因为这似乎是问题所在:

TypeError: cannot do positional indexing on RangeIndex with these indexers [[Int64Index([15], dtype='int64')]] of type list

我不知道为什么我不能这样做,这很令人沮丧,因为它似乎是一个非常基本的操作..

因此,我们将不胜感激任何帮助!

##关于 dropna() 问题的编辑

我试过 .notna() :

for nested_dict in dict_all_raw.values():
    for dflist in nested_dict.values():
        v_max = dflist['velocity'].max()
        v_max_idx = dflist['velocity'].index[dflist['velocity'] == v_max]
        dflist['velocity'] = dflist['velocity'].iloc[0:list(v_max_idx)[0]]
        dflist['velocity'] = dflist['velocity'][dflist['velocity'].notna()]
        dflist['time'] = dflist['time'].iloc[0:list(v_max_idx)[0]]
        dflist['time'] = dflist['time'][dflist['time'].notna()]

并尝试使用 dropna():

for nested_dict in dict_all_raw.values():
    for dflist in nested_dict.values():
        v_max = dflist['velocity'].max()
        v_max_idx = dflist['velocity'].index[dflist['velocity'] == v_max]
        dflist['velocity'] = dflist['velocity'].iloc[0:list(v_max_idx)[0]].dropna()
        dflist['time'] = dflist['time'].iloc[0:list(v_max_idx)[0]].dropna()

没有错误消息,它只是什么都不做:

19  0.385243  1.272031
20  0.405416  1.329072
21  0.425477  1.352059
22  0.445642  1.349657
23  0.465755  1.378407
24       NaN       NaN
25       NaN       NaN
26       NaN       NaN
27       NaN       NaN
28       NaN       NaN
29       NaN       NaN
30       NaN       NaN
31       NaN       NaN
32       NaN       NaN
33       NaN       NaN
34       NaN       NaN
35       NaN       NaN
36       NaN       NaN

Return pandas.Index() in your example is pandas.Int64Index() 的值。

pandas.DataFrame.iloc() 允许像带有 ints 的切片对象这样的输入,例如1:7.

在你的代码中,无论v_max_idx是一个pandas.Index()对象还是[pandas.Index()]是一个列表对象都不符合iloc()参数类型的要求。

您可以使用 list(v_max_idx)pandas.Index() 对象转换为列表,然后使用 [0] 等来访问数据,例如

dflist['time'] = dflist['time'].iloc[0:list(v_max_idx)[0]]