Python pandas删除UserWarning并提高循环效率

4
假设我有以下类似的代码:
import pandas as pd

df=pd.DataFrame({'Name': [ 'Jay Leno', 'JayLin', 'Jay-Jameson', 'LinLeno', 'Lin Jameson', 'Python Leno', 'Python Lin', 'Python Jameson', 'Lin Jay', 'Python Monte'],
                 'Class': ['Rat','L','H','L','L','H', 'H','L','L','Circus']})
df['status']=''

pattern1=['^Jay(\s|-)?(Leno|Lin|Jameson)$','^Python(\s|-)?(Jay|Leno|Lin|Jameson|Monte)$','^Lin(\s|-)?(Leno|Jay|Jameson|Monte)$' ]
pattern2=['^Python(\s|-)?(Jay|Leno|Lin|Jameson|Monte)$' ]
pattern3=['^Lin(\s|-)?(Leno|Jay|Jameson|Monte)$' ]

for i in range(len(pattern1)):
    df.loc[df.Name.str.contains(pattern1[i]),'status'] = 'A'

for i in range(len(pattern2)):
    df.loc[df.Name.str.contains(pattern2[i]),'status'] = 'B'

for i in range(len(pattern3)):
    df.loc[df.Name.str.contains(pattern3[i]),'status'] = 'C'

print (df)

这将打印出:

C:\Python33\lib\site-packages\pandas\core\strings.py:184: UserWarning: This pattern has match groups. To actually get the groups, use str.extract.
  " groups, use str.extract.", UserWarning)
    Class            Name status
0     Rat        Jay Leno      A
1       L          JayLin      A
2       H     Jay-Jameson      A
3       L         LinLeno      C
4       L     Lin Jameson      C
5       H     Python Leno      B
6       H      Python Lin      B
7       L  Python Jameson      B
8       L         Lin Jay      C
9  Circus    Python Monte      B

[10 rows x 3 columns]

我的问题是如何消除错误,是否有一种更高效的方法循环并减少代码量?我知道有一种叫做列表推导式的东西,但我不知道如何使用它们。

我知道可以使用以下方式抑制错误:

pd.options.mode.chained_assignment = None
1个回答

10

使用非捕获括号(?:...):

pattern1=['^Jay(?:\s|-)?(?:Leno|Lin|Jameson)$','^Python(?:\s|-)?(?:Jay|Leno|Lin|Jameson|Monte)$','^Lin(?:\s|-)?(?:Leno|Jay|Jameson|Monte)$' ]
pattern2=['^Python(?:\s|-)?(?:Jay|Leno|Lin|Jameson|Monte)$' ]
pattern3=['^Lin(?:\s|-)?(?:Leno|Jay|Jameson|Monte)$' ]

该警告来自此代码
    if regex.groups > 0:
        warnings.warn("This pattern has match groups. To actually get the"
                      " groups, use str.extract.", UserWarning)

只要没有群组,就没有警告。

我在另一组代码上尝试了这个,但是出现了“错误:无法重复”的提示。 - ccsv
一个可以运行的示例展示这个错误会非常有帮助。 - unutbu
算了,我已经解决了。显然你不能使用(:??i),而必须使用(?i) - ccsv
有趣的是,当面对这样的错误时,我们寻找让这个错误静默下来的方法,而不是修复它的根本原因。就我个人而言,我也是这样做的!@unutbu,再次感谢。:) - propjk007

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接