如果我误解或以其他方式破坏我的问题,请提前道歉......
我是pandas(和python)的新手,并且一直在努力将学到的东西应用到我自己的数据集中。
我有一个稀疏数据框的授权数据,其中许多单元格是空的(或等效的),其中许多单元格应该能够通过规范化来消除。此外,项目编号中包含可用于验证其他单独提供的字段(年份,设保人,研究活动等)的信息。
项目编号如下:
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']
虽然理想情况下能够以行数的方式一次比较所有捕获的组...
任何指导,甚至只是正确方向的健康推动,都将不胜感激......
答案 0 :(得分: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。