Pandas 基本文本数据处理

来源:互联网 发布:瞩目软件下载网址 编辑:程序博客网 时间:2024/06/09 18:12
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       a1       b2       c3    aaba4    baca5     NaN6    caba7     dog8     catdtype: object#大写方法In [3]: s.str.upper()Out[3]: 0       A1       B2       C3    AABA4    BACA5     NaN6    CABA7     DOG8     CATdtype: object#显示字符串的长度In [4]: s.str.len()Out[4]: 0    1.01    1.02    1.03    4.04    4.05    NaN6    4.07    3.08    3.0dtype: float64In [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]: dfOut[10]:     Column A    Column B 0    0.017428    0.0390491   -2.240248    0.8478592   -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]: dfOut[14]:    column_a  column_b0  0.017428  0.0390491 -2.240248  0.8478592 -1.342107  0.3688282.#拆分和替换字符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          NaN3    [f, g, h]dtype: object#元素可以通过str.get()方法来获取In [17]: s2.str.split('_').str.get(1)Out[17]: 0      b1      d2    NaN3      gdtype: object#也可以通过str[]来获取In [18]: s2.str.split('_').str[1]Out[18]: 0      b1      d2    NaN3      gdtype: object#可以通过设置expand参数直接返回一个数据框In [19]: s2.str.split('_', expand=True)Out[19]:      0     1     20    a     b     c1    c     d     e2  NaN  None  None3    f     g     h#可以通过设置n参数来设置分割点的个数In [20]: s2.str.split('_', expand=True, n=1)Out[20]:      0     10    a   b_c1    c   d_e2  NaN  None3    f   g_h#rsplit想对与split来说是从相反的方向(reverse direction)来分割In [21]: s2.str.rsplit('_', expand=True, n=1)Out[21]:      0     10  a_b     c1  c_d     e2  NaN  None3  f_g     h#像replace和findall这样的方法可以使用正则表达式In [22]: s3 = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca',   ....:                '', np.nan, 'CABA', 'dog', 'cat'])   ....: In [23]: s3Out[23]: 0       A1       B2       C3    Aaba4    Baca5        6     NaN7    CABA8     dog9     catdtype: objectIn [24]: s3.str.replace('^.a|dog', 'XX-XX ', case=False)Out[24]: 0           A1           B2           C3    XX-XX ba4    XX-XX ca5            6         NaN7    XX-XX BA8      XX-XX 9     XX-XX tdtype: object3.#通过str[]来索引In [29]: s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan,   ....:                'CABA', 'dog', 'cat'])   ....: In [30]: s.str[0]Out[30]: 0      A1      B2      C3      A4      B5    NaN6      C7      d8      cdtype: objectIn [31]: s.str[1]Out[31]: 0    NaN1    NaN2    NaN3      a4      a5    NaN6      A7      o8      adtype: object4.#提取字符串#如果提取的规则结果有多组,则会返回数据框,不匹配的返回NaNIn [32]: pd.Series(['a1', 'b2', 'c3']).str.extract('([ab])(\d)', expand=False)Out[32]:      0    10    a    11    b    22  NaN  NaN#注意正则表达式中的任何捕获组名称将用于列名,否则捕获的组名将被当作列名In [33]: pd.Series(['a1', 'b2', 'c3']).str.extract('(?P<letter>[ab])(?P<digit>\d)', expand=False)Out[33]:   letter digit0      a     11      b     22    NaN   NaN#参数expand=True在一组返回值的情况下,返回数据框In [35]: pd.Series(['a1', 'b2', 'c3']).str.extract('[ab](\d)', expand=True)Out[35]:      00    11    22  NaN#参数expand=False在一组返回值的情况下,返回序列(Series)In [36]: pd.Series(['a1', 'b2', 'c3']).str.extract('[ab](\d)', expand=False)Out[36]: 0      11      22    NaNdtype: object#参数expand=True作用在索引上时,一组数据返回数据框In [37]: s = pd.Series(["a1", "b2", "c3"], ["A11", "B22", "C33"])In [38]: sOut[38]: A11    a1B22    b2C33    c3dtype: objectIn [39]: s.index.str.extract("(?P<letter>[a-zA-Z])", expand=True)Out[39]:   letter0      A1      B2      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 groupIndex      Index    ValueErrorSeries    Series    DataFrame5.#提取所有匹配的字符串#extract只返回第一个匹配到的字符In [42]: s = pd.Series(["a1a2", "b1", "c1"], index=["A", "B", "C"])In [43]: sOut[43]: A    a1a2B      b1C      c1dtype: objectIn [44]: two_groups = '(?P<letter>[a-z])(?P<digit>[0-9])'In [45]: s.str.extract(two_groups, expand=True)Out[45]:   letter digitA      a     1B      b     1C      c     1#extractall将匹配所有返回的字符In [46]: s.str.extractall(two_groups)Out[46]:         letter digit  match             A 0          a     1  1          a     2B 0          b     1C 0          c     16.#测试是否包含某规则In [56]: pattern = r'[a-z][0-9]'In [57]: pd.Series(['1', '2', '3a', '3b', '03c']).str.contains(pattern)Out[57]: 0    False1    False2    False3    False4    Falsedtype: bool7. #match, contains, startswith, and endswith可以设置缺失值是True还是falseIn [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     True1    False2    False3     True4    False5    False6     True7    False8    Falsedtype: bool8.#提取伪变量In [61]: s = pd.Series(['a', 'a|b', np.nan, 'a|c'])In [62]: s.str.get_dummies(sep='|')Out[62]:    a  b  c0  1  0  01  1  1  02  0  0  03  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'])
0 0
原创粉丝点击