34

データ フレーム内の特定の単語のそれぞれの出現回数をカウントしたいと考えています。私は現在、次を使用してそれを行っていますstr.contains:

a = df2[df2['col1'].str.contains("sample")].groupby('col2').size()
n = a.apply(lambda x: 1).sum()

正規表現を照合して出現回数を取得する方法はありますか? 私の場合、大きなデータフレームがあり、約 100 個の文字列に一致させたいと考えています。

4

3 に答える 3

62

更新:元の回答は、部分文字列を含む行をカウントします。

部分文字列のすべての出現をカウントするには、次を使用できます.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

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.

例えば:

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

出現回数を数えるには、このブール シリーズを合計するだけです。

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
于 2013-07-10T15:08:46.313 に答える
6

一致の総数をカウントするには、 を使用します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

matchstring メソッドは正規表現を処理します...

In [13]: s.str.match('(b[x-y]+)')
Out[13]: 
0       []
1       []
2    (bx,)
3    (by,)
4       []
dtype: object

...しかし、与えられた結果はあまり便利ではありません。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

...カウントされません。

In [15]: s.str.match('(b[x-y]+)').str.get(0).count()
Out[15]: 2
于 2013-07-10T15:08:21.637 に答える