首页 > 解决方案 > 如何使用 pandas 检查一个值是否在 1 个或 2 个列表列中

问题描述

我从 json 数据构建了一个 pandas 数据框:

    {
    'bundle': 'R_FLUSH_DEADLETTERS',
    'envs': ['AG','DEV','QUAL','QUAL2','PREPROD','PREPROD2','PROD'],
    'envsinfra2021': ['PREPROD2'],
    },
    {
    'bundle': 'R201_QA069_ETIQETTENS_FROMSAP',
    'envs': ['DEV','QUAL','QUAL2','PREPROD'],
    'envsinfra2021': ['AG','PREPROD2','PROD'],
},

我可以在“envsinfra2021”列表列中检索包含“PROD”的行

df[['PROD' in x for x in df["envsinfra2021"]]]

我可以在“envs”列表列中检索包含“PROD”的行

df[['PROD' in x for x in df["envs"]]]

但是我怎样才能得到 'PROD' 在 'envs' 或 'envsinfra2021' 中的行?我试过这个

df[ ['PROD' in x for x in df["envs"]] or ['PROD' in x for x in df["envsinfra2021"]] ]

但它返回一个空的 DF

标签: pythonpandaslist

解决方案


将列表转换为 numpy 数组并按|位添加OR

df = df[ np.array(['PROD' in x for x in df["envs"]]) |
         np.array(['PROD' in x for x in df["envsinfra2021"]])]
print (df)
                bundle                                             envs  \
0  R_FLUSH_DEADLETTERS  [AG, DEV, QUAL, QUAL2, PREPROD, PREPROD2, PROD]   

  envsinfra2021  
0    [PREPROD2]  

另一个想法是链标量,所以使用or

df = df[['PROD' in x or 'PROD' in y for x, y in zip(df["envs"], df["envsinfra2021"])]]

推荐阅读