1

フォーマットを間違えたり、質問を壊したりした場合は、事前に謝罪してください...

私はパンダ(およびpython)が初めてで、学んだことを自分のデータセットに適用しようとゆっくりと取り組んでいます。

多くのセルが null (または同等) である助成金データのまばらなデータフレームがあり、その多くは正規化によって取り除くことができるはずです。さらに、プロジェクト番号には、個別に提供された他のフィールド (年、助成者、研究活動など) を検証するために使用できる情報がそれぞれに含まれています。

プロジェクト番号は次のようになります。

0             None,
1             None,
2     3C06RR018774,
3     3C06RR018774,
4     1C06RR018796,
5     1C06RR018796,
6     3C06RR018863,
7     3C06RR018863,
8     1C06RR020099,
9     1C06RR020099,
10    1C06RR020117,

そして、私が作成した正規表現は次のようになります。

reobj = re.compile(r"""
(?P<type>[0-9]+)
(?P<act>[A-Z]+[0-9]+)
(?P<ic>[A-Z]{2})
(?P<serial>[0-9]{1,6})""",
flags=re.X)

これは次の理由でうまくいくと確信しています:

m = core.str.match(reobj)

与えます:

0                     None
1                     None
2     (3, C06, RR, 018774)
3     (3, C06, RR, 018774)
4     (1, C06, RR, 018796)
5     (1, C06, RR, 018796)
6     (3, C06, RR, 018863)
7     (3, C06, RR, 018863)
8     (1, C06, RR, 020099)
9     (1, C06, RR, 020099)
10    (1, C06, RR, 020117)

ただし、グループ m.groups() を取得することもできません。

AttributeError: 'Series' object has no attribute 'groups'

解析されたビット m.str.get(1) を掘り出すこともできません: m.str[0] でも同じエラーが発生します

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-44-2a7675586aff> in <module>()
----> 1 m.str.get(1)

/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/core/strings.pyc in get(self, i)
    668     @copy(str_get)
    669     def get(self, i):
--> 670         result = str_get(self.series, i)
    671         return self._wrap_result(result)
    672 

/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/core/strings.pyc in str_get(arr, i)
    551     """
    552     f = lambda x: x[i]
--> 553     return _na_map(f, arr)
    554 
    555 

/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/core/strings.pyc in _na_map(f, arr, na_result)
     87 def _na_map(f, arr, na_result=np.nan):
     88     # should really _check_ for NA
---> 89     return _map(f, arr, na_mask=True, na_value=na_result)
     90 
     91 

/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/core/strings.pyc in _map(f, arr, na_mask, na_value)
     96         mask = isnull(arr)
     97         try:
---> 98             result = lib.map_infer_mask(arr, f, mask.view(np.uint8))
     99         except (TypeError, AttributeError):
    100             def g(x):

/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/lib.so in pandas.lib.map_infer_mask (pandas/lib.c:39584)()

/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/core/strings.pyc in <lambda>(x)
    550     items : array
    551     """
--> 552     f = lambda x: x[i]
    553     return _na_map(f, arr)
    554 

IndexError: list index out of range

ただし、 m.str[:1] は掘り出します:

0     None
1     None
2      (3)
3      (3)
4      (1)
5      (1)
6      (3)
7      (3)
8      (1)
9      (1)
10     (1)

私の主な誤解は、一連のコンパイルされた一致オブジェクトの反復にあると思いますが、結局のところ、各グループを同じ行内の別のフィールドと比較して、データセットを内部的に検証できるようにしたいと考えています。

m.group('ic') == data['IC']

理想的には、キャプチャされたすべてのグループを一度に配列のような方法で行間で比較できます...

任意のガイダンス、または正しい方向への健全な押し込みでさえ、大歓迎です...

4

1 に答える 1

0

str.matchオブジェクトではなく、タプルを返していmatchます:

>>> c.str.match(reobj)
0                      []
1                      []
2    (3, C06, RR, 018774)
3    (3, C06, RR, 018774)
Name: 1
>>> type(c.str.match(reobj)[2])
<type 'tuple'>

ただし、それらを取得できます。

>>> m = c.map(reobj.match)
>>> m
0                                    None
1                                    None
2    <_sre.SRE_Match object at 0xa1f4c28>
3    <_sre.SRE_Match object at 0xa05aee8>
Name: 1

Seriesそして、それらを使用すると、少し醜いですが、比較することができますdata["IC"]

>>> m.map(lambda x: x.group("ic") if x else None)
0    None
1    None
2      RR
3      RR
Name: 1

グループは次の場所にも保存されることに注意してくださいgroupindex

>>> reobj.groupindex
{'ic': 3, 'type': 1, 'serial': 4, 'act': 2}

そのため、プログラムでそれらをループできます。とにかく、HTH。

于 2013-02-05T18:04:36.020 に答える