处理文本数据

Series和Index内置了一系列的字符串处理方法,只需要访问str属性就可以调用这些方法。

这些方法最大的特点就是会自动忽略缺失值,只处理正常的字符串。


In [4]:
import pandas as pd
import numpy as np

In [5]:
s = pd.Series(['A', 'B', 'C', 'AaBa', 'Baca', np.nan, 'CABA', 'dog', 'cat'])

In [6]:
s.str.lower()


Out[6]:
0       a
1       b
2       c
3    aaba
4    baca
5     NaN
6    caba
7     dog
8     cat
dtype: object

In [7]:
s.str.upper()


Out[7]:
0       A
1       B
2       C
3    AABA
4    BACA
5     NaN
6    CABA
7     DOG
8     CAT
dtype: object

In [8]:
s.str.len()


Out[8]:
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 [9]:
idx = pd.Index([' jack', 'jill ', ' jesse ', 'frank'])

In [10]:
idx.str.strip()


Out[10]:
Index([u'jack', u'jill', u'jesse', u'frank'], dtype='object')

In [11]:
idx.str.lstrip()


Out[11]:
Index([u'jack', u'jill ', u'jesse ', u'frank'], dtype='object')

In [12]:
idx.str.rstrip()


Out[12]:
Index([u' jack', u'jill', u' jesse', u'frank'], dtype='object')

Index的字符串方法在处理DataFrame的列名时很有用。


In [21]:
df = pd.DataFrame(np.random.randn(3, 2), columns=[' Column A', ' Column B '],
                 index=range(3))

In [22]:
df


Out[22]:
Column A Column B
0 -0.928498 -0.053608
1 1.145746 -1.654860
2 -0.707604 -0.338654

df.columns是一个Index对象。所以可以用.str:


In [23]:
df.columns.str.strip()


Out[23]:
Index([u'Column A', u'Column B'], dtype='object')

In [24]:
df.columns.str.lower()


Out[24]:
Index([u' column a', u' column b '], dtype='object')

In [25]:
df.columns = df.columns.str.strip().str.lower().str.replace(' ', '_')

In [26]:
df


Out[26]:
column_a column_b
0 -0.928498 -0.053608
1 1.145746 -1.654860
2 -0.707604 -0.338654

分割和替换字符串


In [27]:
s2 = pd.Series(['a_b_c', 'c_d_e', np.nan, 'f_g_h'])

In [29]:
s2


Out[29]:
0    a_b_c
1    c_d_e
2      NaN
3    f_g_h
dtype: object

In [30]:
s2.str.split('_') # 返回的Series,值是list


Out[30]:
0    [a, b, c]
1    [c, d, e]
2          NaN
3    [f, g, h]
dtype: object

通过[]或get来访问返回的列表元素:


In [31]:
s2.str.split('_').str.get(1)


Out[31]:
0      b
1      d
2    NaN
3      g
dtype: object

In [32]:
s2.str.split('_').str[1]


Out[32]:
0      b
1      d
2    NaN
3      g
dtype: object

使用expand参数来返回一个DataFrame.


In [33]:
s2.str.split('_', expand=True)


Out[33]:
0 1 2
0 a b c
1 c d e
2 NaN None None
3 f g h

通过参数n来限制DataFrame的列数:


In [34]:
s2.str.split('_', expand=True, n=1)


Out[34]:
0 1
0 a b_c
1 c d_e
2 NaN None
3 f g_h

In [35]:
s2.str.rsplit('_', expand=True, n=1)


Out[35]:
0 1
0 a_b c
1 c_d e
2 NaN None
3 f_g h

replace()和findall()也接收正则表达式作参数:


In [36]:
s3 = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca',
               '', np.nan, 'CABA', 'dog', 'cat'])

In [37]:
s3


Out[37]:
0       A
1       B
2       C
3    Aaba
4    Baca
5        
6     NaN
7    CABA
8     dog
9     cat
dtype: object

In [38]:
s3.str.replace('^.a|dog', 'XX-XX', case=False)


Out[38]:
0          A
1          B
2          C
3    XX-XXba
4    XX-XXca
5           
6        NaN
7    XX-XXBA
8      XX-XX
9     XX-XXt
dtype: object

In [ ]:


In [ ]: