如何从Pandas数据框中过滤包含string模式的行
假设我们在Python Pandas中有一个数据框,如下所示:
df = pd.DataFrame({'vals': [1, 2, 3, 4], 'ids': [u'aball', u'bball', u'cnut', u'fball']})
或者,以表格forms:
ids vals aball 1 bball 2 cnut 3 fball 4
如何过滤包含关键词“球”的行? 例如,输出应该是:
ids vals aball 1 bball 2 fball 4
In [3]: df[df['ids'].str.contains("ball")] Out[3]: ids vals 0 aball 1 1 bball 2 3 fball 4
df[df['ids'].str.contains('ball', na = False)] # valid for (at least) pandas version 0.17.1
逐步的解释(从内到外):
-
df['ids']
select数据框的ids
列(技术上,对象df[ids]
是pandas.Series
types的) -
df['ids'].str
允许我们将向量化的string方法(例如,lower
,contains
)应用于Series -
df['ids'].str.contains('ball')
检查系列的每个元素是否有string'ball'作为子string。 结果是一系列的布尔值表示“球”子串的存在是True
还是False
的。 -
df[df['ids'].str.contains('ball')]
将布尔值“mask”应用于数据框,并返回包含适当logging的视图。 -
na = False
从考虑中删除NA / NaN值; 否则可能返回一个ValueError。
>>> mask = df['ids'].str.contains('ball') >>> mask 0 True 1 True 2 False 3 True Name: ids, dtype: bool >>> df[mask] ids vals 0 aball 1 1 bball 2 3 fball 4
尝试这个:
def filterdf(df, f, col): return df[f(df, col)]
然后:
filterdf(df, lambda df, col: df[col].str.contains 'ball')