使用嵌套数组过滤Pandas DataFrame

时间:2017-05-09 19:30:20

标签: python pandas dataframe

我有一个pandas数据框,其中包含一些列中的数组。我想过滤数据框,只包含在该列的嵌套数组中找到特定值的行。

例如,我有一个类似这样的数据框:

label MODEL_INDEX ARRAY_VAL
ID
0    4   (11.0,  0.0)   
1   65   (11.0, 10.0)   
2   73   (11.0, 10.0)   
3   74   (10.0,  0.0)   
4   79   (11.0,  0.0)   
5   80   (10.0,  0.0)   
6   88   (11.0,  0.0) 

我想过滤数据帧,只包括那些满足某些变量条件的数据,比如包含10.0,在ARRAY_VAL下的数组中得到这个:

label MODEL_INDEX ARRAY_VAL
ID  
1   65   (11.0, 10.0)   
2   73   (11.0, 10.0)   
3   74   (10.0,  0.0)    
5   80   (10.0,  0.0) 

基本上,寻找类似的东西:

df[df['ARRAY_VAL'] where 10.0 in df['ARRAY_VAL]]

3 个答案:

答案 0 :(得分:5)

您可以使用.apply搜索数据框每行中的列表:

# creating the dataframe
df = pd.DataFrame(columns = ['model_idx','array_val'])
df.model_idx = [4,65,73,74,79,80,88]
df.array_val = [[11,0],
                [11,10],
                [11,10],
                [10,0],
                [11,0],
                [10,0],
                [11,0]]

# results is a boolean indicating whether the value is found in the list
results = df.array_val.apply(lambda a: 10 in a)

# filter the dataframe based on the boolean indicator
df_final = df[results]

过滤后的数据框为:

In [41]: df_final.head()
Out[41]: 
   model_idx array_val
1         65  [11, 10]
2         73  [11, 10]
3         74   [10, 0]
5         80   [10, 0]

答案 1 :(得分:3)

我认为需要apply,因为您要为每个元组值10.0 in x测试x

df[df['ARRAY_VAL'].apply(lambda x: 10.0 in x)]

答案 2 :(得分:0)

首先建立一个索引

index = []
for i, row in enumerate(df.ARRAY_VAL):
    if 10.0 in row:
        index.append(i)

然后将我们在10.0

中找到df['ARRAY_VAL']的数据编入索引
>>> df.loc[index]

   MODEL_INDEX ARRAY_VAL
1         65  (11, 10)
2         73  (11, 10)
3         74   (10, 0)
5         80   (10, 0)