提取行,其中列的列表在pandas数据框中包含某些值

时间:2020-01-29 06:42:49

标签: python pandas

我有一个看起来像这样的数据框:

:read

我想提取 ID AgeGroups PaperIDs 0 1 [3, 3, 10] [A, B, C] 1 2 [5] [D] 2 3 [4, 12] [A, D] 3 4 [2, 6, 13, 12] [X, Z, T, D] 列中的列表中至少有2个小于7的值和至少1个大于8的值的行。

因此结果应如下所示:

AgeGroups

我不确定该怎么做。

2 个答案:

答案 0 :(得分:3)

首先创建助手DataFrame,然后按DataFrame.lt进行比较,然后 DataFrame.gt,然后按Series.ge进行“序列化”,然后按&进行链掩码进行按位AND:

import ast
#if not lists
#df['AgeGroups'] = df['AgeGroups'].apply(ast.literal_eval)

df1 = pd.DataFrame(df['AgeGroups'].tolist())
df = df[df1.lt(7).sum(axis=1).ge(2) & df1.gt(8).sum(axis=1).ge(1)]
print (df)
   ID       AgeGroups      PaperIDs
0   1      [3, 3, 10]     [A, B, C]
3   4  [2, 6, 13, 12]  [X, Z, T, D]

或将list comprehension与比较numpy数组一起使用,按sum计数,并比较按and链接的两个计数,因为标量:

m = [(np.array(x) < 7).sum() >= 2 and (np.array(x) > 8).sum() >=1  for x in df['AgeGroups']]

df = df[m]
print (df)
   ID       AgeGroups      PaperIDs
0   1      [3, 3, 10]     [A, B, C]
3   4  [2, 6, 13, 12]  [X, Z, T, D]

答案 1 :(得分:2)

如果我使用apply函数为每一行编写的逻辑很简单,也可以对行使用列表推导。

data = {'ID':['1', '2', '3', '4'], 'AgeGroups':[[3,3,10],[2],[4,12],[2,6,13,12]],'PaperIDs':[['A','B','C'],['D'],['A','D'],['X','Z','T','D']]} 
df = pd.DataFrame(data)
def extract_age(row):
    my_list = row['AgeGroups']
    count1 = 0
    count2 = 0
    if len(my_list)>=3:
        for i in my_list:
            if i<7:
                count1 = count1 +1
            elif i>8:
                count2 = count2+1
    if (count1 >= 2) and (count2 >=1):
        print(row['AgeGroups'],row['PaperIDs'])


df.apply(lambda x: extract_age(x), axis =1)

输出

[3, 3, 10] ['A', 'B', 'C']
[2, 6, 13, 12] ['X', 'Z', 'T', 'D']