目录
某列(series)强制转换为字符串类型 .astype(str)
某列(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)