pandas中的字符串解析

目录

某列(series)强制转换为字符串类型 .astype(str)

报错经验: 

 现象: 

某字符串类型列去除两端的特殊符号.str.strip()

某字符串类型列进行分割str.split() 详解


某列(series)强制转换为字符串类型 .astype(str)

pandas中查看各列数据类型的函数为 df.dtypes , 注意后面不用加括号。 pandas中各数据类型与python的对应关系表如下: 注意python中的字符串str类型默认是对应object,但是object并不完全具有str的特性,因此如果想要用str的特性,一般最好是是强制转换为str而不是设置为object类型。 (因为object在pandas中通常是不能全部转换为int或者float类型时就默认用object代替)。

某列数据 转换为object无法正确调用str.split,得到的为空。

#data 本身为一个df 
data['test']=202
data['testStr']=303
data=data[['test','testStr']]
data['test']=data['test'].astype(object) # 转换为object 类型
data['test_object']=data.test.str.split('0')# 上面强制转换为object无法正确调用str.split,得到的为空。
print(data.head(2))
print(data.dtypes)

结果:

某列转换为了str类型,调用str.split才能确保正确进行分割和取值 

data['testStr']=303
print(data.head(2))
data['testStr']=data['testStr'].astype(str) # 转换为str 类型
data['test_str_spl']=data.testStr.str.split('0') # 因为上面转换为了str类型,才能调用str.split进行分割和取值
print(data.head(2))
print(data.dtypes)

输出: (虽然df.dtypes时,testStr列也是显示为object但是实际是经过强制转换为str的object了。所以通常如果要调用str.function,通常需要将这列强转为str ,这样更保险。 

报错经验: 

 现象: 

data['test_object_error']=data.test.str.split('0').str[0]

“AttributeError: Can only use .str accessor with string values, which use np.object_ dtype in pandas” 
这个时候就要考虑是否是并非原始就完全为字符串的object类型去调用str的相关函数了。因为data.test这列只是为object类型,并非str,这样分割得到的就为NaN,而无法进一步调用后续的str[0]。 如果是test为强制转换为str过了,则可以。 

某字符串类型列去除两端的特殊符号.str.strip()

案例,去除字符串首尾的"[" 和"]" 标示 

data.per为已经强转为str类型了。 

某字符串类型列进行分割str.split() 详解

利用str.split分割,其中参数pat标示分割符,参数expand=True标示返回得到的是一个由分割后的得到字段作为各列而组成的dataframe, 且列名从0开始标示。

pers=[0.2,0.25,0.275,0.3,0.325,0.35,0.375,0.40,0.50,0.60,0.65,0.7,0.75,0.8,0.84,0.86,0.88,0.90,0.92,0.94,0.96,0.98
]
pers_dic={}
for k ,v in enumerate(pers):
    pers_dic[k]=str(v)
per_df=data.per.str.split(pat=",",expand=True).rename(columns=pers_dic) # 利用str.split分割,其中参数pat标示分割符,expand=True标示返回得到的是一个由分割后的得到字段作为各列而组成的dataframe, 且列名从0开始标示。 rename是重命名
per_df.index
per_df[[str(v) for v in pers]] =per_df[[str(v) for v in pers]].astype('float').round(4)  # 转换类型
data_part=data[['timeZone']]
res_merge=pd.merge(data_part,per_df,how='left',left_index=True,right_index=True) # 将分割得到的df和原df利用merge进行合并,注意left_index 和right_index都设为True,这样索引就对的上。 

处理前的数据形态,per为str类型的,中间以逗号连接的数据

运行代码处理后: 

str.split函数参数详解: 

pandas.Series.str.split(pat=None, n=-1, expand=False)的参数如下:

  • pat:string 或者 正则表达式,若为空,则为连续的空格,包括(换行符、空格、制表符)
  • n:默认值为-1,若为None, 0 都会被修改成-1(从上图中的源码也能看出来),即能分割多少次就分割多少次,与str.split()的n=-1,re.split()的maxsplit=0一致;
  • expand:决定了分割后的结果是分布在多列(True返回DataFrame)还是以列表(默认False返回一个series列表) 的形式分布在一列中(返回Series)

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值