假设我有以下数据框
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')
似乎无法正常工作,而我似乎无法正常使用'权利'列表中的项目。
答案 0 :(得分:3)
您可以将apply
与lambda
函数一起使用,而不是转换数据类型。
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')]