【5.1.1】Pandas字符串处理

一、常见用法

1. 分割列的字符

import pandas as pd  
data['name'].str.split('|',expand=True)  

关键是参数expand,这个参数取True时,会把切割出来的内容当做一列。 如果不需要pandas为你分好列,expand=False就可以了。

然后,我们如果只想要第一列的话,只需要做:

data['name'].str.split('|',expand=True)[0]  

2. 合并列成一个新列

如果某一列是非str类型的数据,那么我们需要用到map(str)将那一列数据类型做转换:

dataframe["newColumn"] = dataframe["age"].map(str) + dataframe["phone"] + dataframe["address”]

3. 对某列的字符串做统计长度

test['contentLen2'] = test['content'].str.len()

4. 提出某一列某个位置的字符串

df['pfsc'] = df['PFSC Sequence'].str[2]

二、具体案例

2.1 特殊符号的处理

有一个名为’Amount’列的表。 单元格值是诸如1,100和1000的数字的混合,以及诸如’(1000)’和’(999)’的字符串,其表示负值。如何将负值的字符串更改为数字,如-1000和-999?

import pandas as pd
ws_actual = pd.read_excel(file_name, sheet_name=0)


Project Name    Amount
a   1000.53
b   (-100.2)
c   999.83
d   99999.1
e   333.62
f   (-10502.30)
g   (-2036.63)
h   25235
i   69103
j   5923
k   6920

简单的做法

df.Amount.astype(str).str.strip('()').astype(float)

0      1000.53
1      -100.20
2       999.83
3     99999.10
4       333.62
5    -10502.30
6     -2036.63
7     25235.00
8     69103.00
9      5923.00
10     6920.00
Name: Amount, dtype: float64

如果括号中的值包含负符号或者括号需要用负符号替换,则它是不明确的。如果是后者,你需要一个正则表达式。

如果你有像(1000)这样的字符串也需要转换为负数:

print(df)

  ProjectName  Amount
0           a  (1000)
1           b     100
2           c   (999)

df.Amount.astype(str).str.replace(r'\(([-\d\.]+)\)', r'-\1').astype(float)

0   -1000.0
1     100.0
2    -999.0
Name: Amount, dtype: float64

参考资料

个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn

Sam avatar
About Sam
专注生物信息 专注转化医学