【5.1.1】Pandas字符串处理(split/map/len/replace/count)
一、常见用法
1.1 分割列的字符 split
用法:
Series.str.split(pat=None, n=-1, expand=False)
pat : 字符串,默认使用空格分隔,列的基础,可以是空格、符号、字符串等。
n : 整型,默认为-1,既使用所有的分割点分割。
案例:
import pandas as pd
data['name'].str.split('|',expand=True)
关键是参数expand,这个参数取True时,会把切割出来的内容当做一列。 如果不需要pandas为你分好列,expand=False就可以了。
然后,我们如果只想要第一列的话,只需要做:
data['name'].str.split('|',expand=True)[0]
n参数,指定分隔的次数
>>> df[0].str.split('_', n = 1)
0 [A, 1_1]
1 [B, 2_1]
2 [C, 3_1]
3 [D, 4_1]
Name: 0, dtype: object
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可以用来正则匹配筛选
1.5 统计字符串
df['t_num'] = df['reference_kmer'].str.count('T')
二、具体案例
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
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn