使用列表在单元格中设置pandas数据帧

时间:2016-01-19 22:13:59

标签: python pandas dataframe subset

假设我有以下数据框

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']

如何进行子集以使其与列表中的字符串INSIDE匹配?在这个例子中,对不包含“nodata”的行进行子集化。在col3?

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

似乎无法正常工作,而我似乎无法正常使用'权利'列表中的项目。

2 个答案:

答案 0 :(得分:3)

您可以将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

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

答案 1 :(得分:1)

如果将列的数据类型转换为字符串,则代码应该有效:

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