Nil*_*age 15 python dataframe pandas
我想计算数据帧中某些单词的出现次数.我知道使用"str.contains"
a = df2[df2['col1'].str.contains("sample")].groupby('col2').size()
n = a.apply(lambda x: 1).sum()
Run Code Online (Sandbox Code Playgroud)
目前我正在使用上面的代码.有没有一种方法可以匹配正则表达式并获取出现次数?在我的情况下,我有一个大型数据帧,我想匹配大约100个字符串.
And*_*den 22
更新:原始答案计算包含子字符串的行.
要计算您可以使用的子字符串的所有出现次数.str.count:
In [21]: df = pd.DataFrame(['hello', 'world', 'hehe'], columns=['words'])
In [22]: df.words.str.count("he|wo")
Out[22]:
0 1
1 1
2 2
Name: words, dtype: int64
In [23]: df.words.str.count("he|wo").sum()
Out[23]: 4
Run Code Online (Sandbox Code Playgroud)
该str.contains方法接受正则表达式:
Definition: df.words.str.contains(self, pat, case=True, flags=0, na=nan)
Docstring:
Check whether given pattern is contained in each string in the array
Parameters
----------
pat : string
Character sequence or regular expression
case : boolean, default True
If True, case sensitive
flags : int, default 0 (no flags)
re module flags, e.g. re.IGNORECASE
na : default NaN, fill value for missing values.
Run Code Online (Sandbox Code Playgroud)
例如:
In [11]: df = pd.DataFrame(['hello', 'world'], columns=['words'])
In [12]: df
Out[12]:
words
0 hello
1 world
In [13]: df.words.str.contains(r'[hw]')
Out[13]:
0 True
1 True
Name: words, dtype: bool
In [14]: df.words.str.contains(r'he|wo')
Out[14]:
0 True
1 True
Name: words, dtype: bool
Run Code Online (Sandbox Code Playgroud)
要计算出现的次数,您可以将此布尔值系列求和:
In [15]: df.words.str.contains(r'he|wo').sum()
Out[15]: 2
In [16]: df.words.str.contains(r'he').sum()
Out[16]: 1
Run Code Online (Sandbox Code Playgroud)
您可以使用value_count函数。
import pandas as pd
# URL to .csv file
data_url = 'https://vincentarelbundock.github.io/Rdatasets/csv/carData/Arrests.csv'
# Reading the data
df = pd.read_csv(data_url, index_col=0)
Run Code Online (Sandbox Code Playgroud)
# pandas count distinct values in column
df['sex'].value_counts()
Run Code Online (Sandbox Code Playgroud)
来源:链接
要计算匹配的总数,请使用s.str.match(...).str.get(0).count()。
如果您的正则表达式将匹配几个独特的单词,要单独计算,请使用
s.str.match(...).str.get(0).groupby(lambda x: x).count()
它是这样工作的:
In [12]: s
Out[12]:
0 ax
1 ay
2 bx
3 by
4 bz
dtype: object
Run Code Online (Sandbox Code Playgroud)
该match字符串的方法处理正则表达式...
In [13]: s.str.match('(b[x-y]+)')
Out[13]:
0 []
1 []
2 (bx,)
3 (by,)
4 []
dtype: object
Run Code Online (Sandbox Code Playgroud)
...但结果,正如给定的,不是很方便。string 方法get将匹配项作为字符串并将空结果转换为 NaN...
In [14]: s.str.match('(b[x-y]+)').str.get(0)
Out[14]:
0 NaN
1 NaN
2 bx
3 by
4 NaN
dtype: object
Run Code Online (Sandbox Code Playgroud)
……不计算在内。
In [15]: s.str.match('(b[x-y]+)').str.get(0).count()
Out[15]: 2
Run Code Online (Sandbox Code Playgroud)