Pandas 基本文本数据处理
2017-05-08 00:00
393 查看
1. # 系列和索引配有一组字符串处理方法,使它容易操作数组的每个元素。或许最重要的是,这些方法自动排除失踪/ NA值。这里有一些字符串方法的例子: In [1]: s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan, 'CABA', 'dog', 'cat']) #小写方法 In [2]: s.str.lower() Out[2]: 0 a 1 b 2 c 3 aaba 4 baca 5 NaN 6 caba 7 dog 8 cat dtype: object #大写方法 In [3]: s.str.upper() Out[3]: 0 A 1 B 2 C 3 AABA 4 BACA 5 NaN 6 CABA 7 DOG 8 CAT dtype: object #显示字符串的长度 In [4]: s.str.len() Out[4]: 0 1.0 1 1.0 2 1.0 3 4.0 4 4.0 5 NaN 6 4.0 7 3.0 8 3.0 dtype: float64 In [5]: idx = pd.Index([' jack', 'jill ', ' jesse ', 'frank']) #去除两边的空格 In [6]: idx.str.strip() Out[6]: Index([u'jack', u'jill', u'jesse', u'frank'], dtype='object') #去除左边的空格 In [7]: idx.str.lstrip() Out[7]: Index([u'jack', u'jill ', u'jesse ', u'frank'], dtype='object') #去除右边的空格 In [8]: idx.str.rstrip() Out[8]: Index([u' jack', u'jill', u' jesse', u'frank'], dtype='object') # df.columns一个index对象,所以我们科研用.str存取器 In [9]: df = pd.DataFrame(randn(3, 2), columns=[' Column A ', ' Column B '], ...: index=range(3)) ...: In [10]: df Out[10]: Column A Column B 0 0.017428 0.039049 1 -2.240248 0.847859 2 -1.342107 0.368828 #去除列名的空格 In [11]: df.columns.str.strip() Out[11]: Index([u'Column A', u'Column B'], dtype='object') #列名小写 In [12]: df.columns.str.lower() Out[12]: Index([u' column a ', u' column b '], dtype='object') #将列名先去空,再小写,再将空格替换为"_" In [13]: df.columns = df.columns.str.strip().str.lower().str.replace(' ', '_') In [14]: df Out[14]: column_a column_b 0 0.017428 0.039049 1 -2.240248 0.847859 2 -1.342107 0.368828 2. #拆分和替换字符 In [15]: s2 = pd.Series(['a_b_c', 'c_d_e', np.nan, 'f_g_h']) #以_拆分,返回的是列表 In [16]: s2.str.split('_') Out[16]: 0 [a, b, c] 1 [c, d, e] 2 NaN 3 [f, g, h] dtype: object #元素可以通过str.get()方法来获取 In [17]: s2.str.split('_').str.get(1) Out[17]: 0 b 1 d 2 NaN 3 g dtype: object #也可以通过str[]来获取 In [18]: s2.str.split('_').str[1] Out[18]: 0 b 1 d 2 NaN 3 g dtype: object #可以通过设置expand参数直接返回一个数据框 In [19]: s2.str.split('_', expand=True) Out[19]: 0 1 2 0 a b c 1 c d e 2 NaN None None 3 f g h #可以通过设置n参数来设置分割点的个数 In [20]: s2.str.split('_', expand=True, n=1) Out[20]: 0 1 0 a b_c 1 c d_e 2 NaN None 3 f g_h #rsplit想对与split来说是从相反的方向(reverse direction)来分割 In [21]: s2.str.rsplit('_', expand=True, n=1) Out[21]: 0 1 0 a_b c 1 c_d e 2 NaN None 3 f_g h #像replace和findall这样的方法可以使用正则表达式 In [22]: s3 = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', ....: '', np.nan, 'CABA', 'dog', 'cat']) ....: In [23]: s3 Out[23]: 0 A 1 B 2 C 3 Aaba 4 Baca 5 6 NaN 7 CABA 8 dog 9 cat dtype: object In [24]: s3.str.replace('^.a|dog', 'XX-XX ', case=False) Out[24]: 0 A 1 B 2 C 3 XX-XX ba 4 XX-XX ca 5 6 NaN 7 XX-XX BA 8 XX-XX 9 XX-XX t dtype: object 3. #通过str[]来索引 In [29]: s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan, ....: 'CABA', 'dog', 'cat']) ....: In [30]: s.str[0] Out[30]: 0 A 1 B 2 C 3 A 4 B 5 NaN 6 C 7 d 8 c dtype: object In [31]: s.str[1] Out[31]: 0 NaN 1 NaN 2 NaN 3 a 4 a 5 NaN 6 A 7 o 8 a dtype: object 4. #提取字符串 #如果提取的规则结果有多组,则会返回数据框,不匹配的返回NaN In [32]: pd.Series(['a1', 'b2', 'c3']).str.extract('([ab])(\d)', expand=False) Out[32]: 0 1 0 a 1 1 b 2 2 NaN NaN #注意正则表达式中的任何捕获组名称将用于列名,否则捕获的组名将被当作列名 In [33]: pd.Series(['a1', 'b2', 'c3']).str.extract('(?P<letter>[ab])(?P<digit>\d)', expand=False) Out[33]: letter digit 0 a 1 1 b 2 2 NaN NaN #参数expand=True在一组返回值的情况下,返回数据框 In [35]: pd.Series(['a1', 'b2', 'c3']).str.extract('[ab](\d)', expand=True) Out[35]: 0 0 1 1 2 2 NaN #参数expand=False在一组返回值的情况下,返回序列(Series) In [36]: pd.Series(['a1', 'b2', 'c3']).str.extract('[ab](\d)', expand=False) Out[36]: 0 1 1 2 2 NaN dtype: object #参数expand=True作用在索引上时,一组数据返回数据框 In [37]: s = pd.Series(["a1", "b2", "c3"], ["A11", "B22", "C33"]) In [38]: s Out[38]: A11 a1 B22 b2 C33 c3 dtype: object In [39]: s.index.str.extract("(?P<letter>[a-zA-Z])", expand=True) Out[39]: letter 0 A 1 B 2 C #参数expand=False作用在索引上时,一组数据返回索引 In [40]: s.index.str.extract("(?P<letter>[a-zA-Z])", expand=False) Out[40]: Index([u'A', u'B', u'C'], dtype='object', name=u'letter') #下图表示了在expand=False时,各种情况下index,Series返回值的情况 1 group >1 group Index Index ValueError Series Series DataFrame 5. #提取所有匹配的字符串 #extract只返回第一个匹配到的字符 In [42]: s = pd.Series(["a1a2", "b1", "c1"], index=["A", "B", "C"]) In [43]: s Out[43]: A a1a2 B b1 C c1 dtype: object In [44]: two_groups = '(?P<letter>[a-z])(?P<digit>[0-9])' In [45]: s.str.extract(two_groups, expand=True) Out[45]: letter digit A a 1 B b 1 C c 1 #extractall将匹配所有返回的字符 In [46]: s.str.extractall(two_groups) Out[46]: letter digit match A 0 a 1 1 a 2 B 0 b 1 C 0 c 1 6. #测试是否包含某规则 In [56]: pattern = r'[a-z][0-9]' In [57]: pd.Series(['1', '2', '3a', '3b', '03c']).str.contains(pattern) Out[57]: 0 False 1 False 2 False 3 False 4 False dtype: bool 7. #match, contains, startswith, and endswith可以设置缺失值是True还是false In [59]: s4 = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan, 'CABA', 'dog', 'cat']) In [60]: s4.str.contains('A', na=False) Out[60]: 0 True 1 False 2 False 3 True 4 False 5 False 6 True 7 False 8 False dtype: bool 8. #提取伪变量 In [61]: s = pd.Series(['a', 'a|b', np.nan, 'a|c']) In [62]: s.str.get_dummies(sep='|') Out[62]: a b c 0 1 0 0 1 1 1 0 2 0 0 0 3 1 0 1 #获取复杂索引 In [63]: idx = pd.Index(['a', 'a|b', np.nan, 'a|c']) In [64]: idx.str.get_dummies(sep='|') Out[64]: MultiIndex(levels=[[0, 1], [0, 1], [0, 1]], labels=[[1, 1, 0, 1], [0, 1, 0, 0], [0, 0, 0, 1]], names=[u'a', u'b', u'c'])
相关文章推荐
- Pandas 基本文本数据处理
- pandas的基本用法(四)——处理缺失数据
- Pyhton科学计算工具Pandas(六)—— 文本数据处理
- pandas处理csv数据基本用法
- <学习笔记>王爽汇编语言__处理数据的两个基本问题
- 数据处理的两个基本问题05 - 零基础入门学习汇编语言42
- 关于在线考试中处理富文本和json数据的问题
- 字符串处理是许多程序中非常重要的一部分,它们可以用于文本显示,数据表示,查找键和很多目的.在Unix下,用户可以使用正则表达式的强健功能实现这些 目的,从Java1.4起,Java核心API就引入了java.util.regex程序包,它是一种有价值的基础
- 数据恢复与软故障处理基本指南
- 大数据,大文本的处理、JDBC啊!
- 数据处理的两个基本问题04 - 零基础入门学习汇编语言41
- Oracle Database 10g 中的正规表达式特性是一个用于处理文本数据的强大工具
- 利用AJAX实现简单的用户登录程序(处理服务端返回的文本数据)
- JDBC处理大数据(大文本的存储和读取)
- 使用JDBC处理大数据和大文本
- 数据处理的两个基本问题04 - 零基础入门学习汇编语言41
- GOOGLE Gadgets 处理远程内容,如何提取和控制远程文本(通常为 HTML)、XML、JSON 和 RSS/Atom 供稿数据。
- dealstring 处理文本文档的数据.
- 数据处理的两个基本问题01 - 零基础入门学习汇编语言38
- ubuntu之shell编程学习笔记5——基本文本处理