熊猫可迭代索引中的多重索引后过滤

时间:2019-09-08 11:58:31

标签: python pandas dataframe

我想使用Pandas或使用分层索引的其他任何python库来创建我的dataFrame对象的子集,该索引可以根据我在一列中的行数进行迭代。

import numpy as np
import pandas as pd
from pandas import Series, DataFrame
df = pd.read_csv(address)

    trajectory  frame   x           y                                               

        1       1       447,956     2,219
        1       2       447,839     2,327
        1       3       449,183     1,795
        1       4       450,444     1,833
        1       5       448,514     1,708
        1       6       451,532     1,832
        1       7       448,471     1,759
        1       8       450,028     2,097
        1       9       448,215     2,203
        1       10      449,311     2,063
        1       11      451,745     1,76
        1       12      450,827     2,264
        1       13      448,991     2,208
        1       14      452,829     3,106
        1       15      448,688     1,77
        1       16      449,844     1,951
        1       17      450,044     1,991
        1       18      449,835     1,901
        1       19      450,793     3,49
        1       20      449,618     2,354
        2       1       445.936     7.219
        2       2       442.879     3.327
        3       1       441.283     9.795
        4       1       447.956     2.219
        4       3       447.839     2.327
        4       6       449.183     1.795

在此DataFrame中,假设有4列,名称:“轨迹”,“框架”,“ x”和“ y”。一个数据帧到另一个数据帧的“轨迹”数可以不同。每个“轨迹”可以有1到20之间的多个帧,其中它们可以是1到20的连续帧,也可以有一些丢失的帧。每个框架在“ x”和“ y”列中都有其自己的值。

我的目标是创建一个新的数据框,在其中我只能具有所有20行都具有“框”值的“轨迹”。随着“轨迹”和“框架”列中的行数不断变化,因此我希望有一个可以在这种情况下使用的代码。

df_1 = df.set_index(['trajectory','frame'], drop=False)

在这里,我使用'trajectory'和'frame'进行了分层索引,然后发现编号为1和6的'trajectory'中有20个框架。因此,我可以使用以下代码手动选择它们。

df_1_subset = df_1[(df1['traj']== 1)|(df1['trajectory']== 6)]

但是,我有多个csv文件,其中在每个Dataframe中,在“ frame”列中将有20行的“轨迹”将有所不同,因此我将必须手动执行此操作。我认为,肯定有更好的方法,但是我似乎找不到它。我对编码非常陌生,非常感谢任何人的帮助。预先非常感谢。

1 个答案:

答案 0 :(得分:0)

如果需要trajectory1的过滤器6级别,请使用Index.get_level_valuesIndex.isin

df_1_subset = df_1[df1.index.get_level_values('trajectory').isin([1,6])]

如果需要针对trajectory的过滤器1级别和针对frame的{​​{1}}级别,请选择DataFrame.loc和元组:

6

替代:

df_1_subset = df_1.loc[(1, 6)]