使用pandas.Series.str.get:正确的方法是什么?

时间:2019-07-26 08:39:19

标签: python python-3.x string pandas

我正在关注韦斯·麦金尼(Wes Mckinney)的精彩著作,以了解pandas的发展。但是,我似乎无法理解为什么pandas.Series.str.get无法正常工作。我在这里查看了一些Github问题和问题,但似乎无济于事。

数据

data = pd.Series({'Dave': 'dave@google.com', 'Steve': 'steve@gmail.com', 'Rob': 'rob@yahoo.com', 'Wes': np.nan}
)

代码

import pandas as pd
import re
import numpy as np
pattern = '[a-zA-Z0-9]+@.*'
matches = data.str.match(pattern)
matches.str.get(1)

上面的代码应该可以工作,并导致类似:

Dave NaN
Rob  NaN
Steve NaN

我确实使用了与本书不同的正则表达式模式,但不认为这是问题所在。

错误

  

raise AttributeError(“仅可对字符串”“ values!”使用.str访问器。)   AttributeError:只能将.str访问器与字符串值一起使用

我想念什么?我正在使用pycharm社区和python 3.6.6, 熊猫版本:0.24.2 如果有帮助的话。

这是本书的屏幕截图: enter image description here

1 个答案:

答案 0 :(得分:2)

获得包含NaN的序列的原因是因为matches是布尔值Series

In[58]:
matches

Out[58]: 
Dave     True
Steve    True
Rob      True
Wes       NaN
dtype: object

因此,在这种情况下将元素返回顺序位置是没有意义的,因此为什么要获得SeriesNaN中的In[61]: s = pd.Series(["String", ... (1, 2, 3), ... ["a", "b", "c"], ... 123, ... -456, ... {1: "Hello", "2": "World"}]) s Out[61]: 0 String 1 (1, 2, 3) 2 [a, b, c] 3 123 4 -456 5 {1: 'Hello', '2': 'World'} dtype: object In[62]: s.str.get(1) Out[62]: 0 t 1 2 2 b 3 NaN 4 NaN 5 Hello dtype: object

如果您查看文档中的示例:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.str.get.html#pandas.Series.str.get

NaN

因此,这里是按行的顺序返回每一行的元素。您可以看到,对于某些行,没有第二个元素,因此它返回 @Override protected String doInBackground(String... params) { String usernam = username.getText().toString(); String passwordd = password.getText().toString(); if(usernam.trim().equals("")|| passwordd.trim().equals("")) { z = "Please enter Username and Password"; } else { try { con = connectionclass(un, pass, db, ip); if (con == null) { z = "Check Tour Internet Access!"; } else { String query = "select * from login where user_name= '" + usernam.toString() + "' and pass_word = ' " + passwordd.toString(); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(query); if(rs.next()) { z = "Login successful"; isSuccess = true; con.close(); } else { z = "Invalid Credentials"; isSuccess = false; } } } catch (Exception ex) { isSuccess = false; z = ex.getMessage(); } } return z; }