【5.1.1】Pandas字符串处理

一、常见用法

1.1 分割列的字符

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

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

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

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

1.2 合并列成一个新列

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

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

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

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

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

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

1.5 字符串替换

import pandas as pd

#创建数据集
df = pd.DataFrame(
        {
            '名称':['产品1','产品2','产品3','产品4','产品5','产品6','产品7','产品8'],
            '数量':['A','0.7','0.8','0.4','0.7','B','0.76','0.28'],
            '金额':['0','0.48','0.33','C','0.74','0','0','0.22'],
            '合计':['D','0.37','0.28','E','0.57','F','0','0.06'],
        }
        )

#搜索整个DataFrame, 并将所有符合条件的元素全部替换。操作之后,其实原DataFrame是并没有改变的。改变的只是一个复制品。
df.replace('A', 0.1)

#如果需要改变原数据,需要添加常用参数 inplace=True
df.replace('A', 0.1, inplace=True)

#inplace这个参数在一般情况没多大用处,但是如果只替换部分区域时,inplace参数就有用了
df['金额'].replace(0, 0.22, inplace=True)
'''
在上面这个操作中,‘合计’这一列中的0,并没有被替换。
只有‘金额’这一列的0被替换,而且,替换后的结果不需要我们再和原数据进行合并操作,直接体现在原数据中。
'''

#可以用字典形式替换多个值
df.replace({'C':0.9999, 'F':0.7777})
df.replace(['C', 'F'], [0.999, 0.777])
df['合计'].replace({'D':0.11111, 'F':0.22222}, inplace=True)

#如果替换的值都是一样的话
df.replace(['C', 'F'], 0.33333)
df['合计'].replace(['D', 'F'], 0.0111, inplace=True)

#参数regex,可以使用正则表达式替换多个
df.replace('[A-Z]', 0.99, regex=True)

#只需要替换某个数据的部分内容
df['名称'].str.replace('产品', 'product')

#某些列满足特定条件,然后改变另外的某些列的值
df.loc[df['数量'] == 'A', '合计'] = 'changed'  # 关键句,直接改变df的值
df.loc[df['合计'].str.contains('change'), '数量'] = 'A'     #使用countains可以用来正则匹配筛选

二、具体案例

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
专注生物信息 专注转化医学