我想使用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行的“轨迹”将有所不同,因此我将必须手动执行此操作。我认为,肯定有更好的方法,但是我似乎找不到它。我对编码非常陌生,非常感谢任何人的帮助。预先非常感谢。
答案 0 :(得分:0)
如果需要trajectory
或1
的过滤器6
级别,请使用Index.get_level_values
和Index.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)]