用单元格中的列表子集 pandas 数据框

Subsetting pandas dataframe with list in cell

假设我有以下数据框

df = pd.DataFrame({'col1': ['one','one', 'one', 'one', 'two'],
                   'col2': ['two','two','four','four','two'],
                   'col3': [['alpha', 'beta'],
                            ['alpha', 'beta'],
                            ['alpha', 'beta'],
                            ['alpha', 'beta'],
                            ['alpha', 'nodata', 'beta', 'gamma']]})

我知道我可以子集化:

df[df['col2']=='four']

如何进行子集匹配以匹配列表中的字符串?在此示例中,子集不包含 'nodata' in col3?

的行
df[~df['col3'].str.contains('nodata') 

似乎不​​起作用,我似乎无法正确访问列表中的 'right' 项。

如果您将列的数据类型转换为字符串,您的代码应该可以工作:

df[~df['col3'].astype(str).str.contains('nodata')]

您可以将 applylambda 函数结合使用,而不是转换数据类型,这样会更快一些。

df[~df.col3.apply(lambda x: 'nodata' in x)]

在更大的数据集上测试它:

In [86]: df.shape
Out[86]: (5000, 3)   

我的解决方案:

In [88]: %timeit df[~df.col3.apply(lambda x: 'nodata' in x)]
         1000 loops, best of 3: 1.68 ms per loop

上一个解决方案:

In [87]: %timeit df[~df['col3'].astype(str).str.contains('nodata')]
         100 loops, best of 3: 7.8 ms per loop

可以说第一个答案可能更具可读性。