pandas中的字符串解析

本文详细介绍了在Pandas中如何将列转换为字符串类型,以及在处理字符串时遇到的问题。通过示例展示了astype(str)用于将列强制转换为字符串,而当转换为object类型时,无法直接调用str.split()。同时,分享了如何使用str.strip()去除字符串首尾特殊符号,以及str.split()的使用方法,包括参数pat和expand的含义。在处理过程中,强调了数据类型转换的重要性,以确保能正确调用字符串方法。文章最后提供了一个具体的字符串处理案例,展示了如何利用str.split()进行数据分割并与其他数据合并。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

某列(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)

### 使用 Pandas字符串数据读取 XLSX 文件 要通过字符串形式的内容来读取 `.xlsx` 文件,通常需要借助 `io.BytesIO` 将字符串转换为字节流对象,然后再传递给 `pandas.read_excel()` 函数。以下是实现方法的具体说明: #### 方法概述 由于 `pandas.read_excel()` 不支持直接从字符串读取文件,因此可以通过 Python 的标准库模块 `io.BytesIO` 创建一个类文件对象[^1]。此对象能够模拟文件的行为,从而允许 Pandas 正常解析其内容。 #### 实现代码示例 以下是一个完整的代码示例,展示如何从字符串加载 `.xlsx` 文件并使用 Pandas 进行解析: ```python import pandas as pd from io import BytesIO # 假设这是从其他地方获取的 .xlsx 文件的二进制字符串表示 binary_data = b'\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1...' # 示例二进制数据 # 将二进制字符串转换为字节流对象 excel_file = BytesIO(binary_data) # 使用 pandas 读取 Excel 文件 df = pd.read_excel(excel_file, sheet_name='Sheet1') # 指定工作表名称或索引 # 输出 DataFrame 结构 print(df.head()) # 显示前几行数据 ``` 上述代码中,`BytesIO` 被用来创建一个内存中的文件样对象,而 `pd.read_excel()` 则负责解析该对象并返回一个 DataFrame 表格结构[^2]。 #### 处理日期字段的情况 如果目标 `.xlsx` 文件中含有日期类型的列,默认情况下 Pandas 可能会自动识别这些列为日期时间类型 (datetime64),而不是简单的字符串格式。为了强制将某些特定列视为纯字符串而非日期时间类型,可以在调用 `read_excel()` 时设置参数 `dtype` 来指定每列的数据类型[^5]。例如: ```python df = pd.read_excel( excel_file, sheet_name='Sheet1', dtype={'Date_Column': str} # 强制将 'Date_Column' 设为字符串类型 ) ``` 这样可以确保即使原数据是以浮点数或其他非字符串形式存储的日期值也能被正确解释成所需的文本格式。 #### 安装依赖项 在执行以上操作之前,请确认已安装所需的所有外部库。如果没有的话,可通过运行下面这条命令完成安装过程: ```bash pip install pandas openpyxl sqlalchemy ``` 这一步骤对于成功解析现代版 Microsoft Office 所产生的 `.xlsx` 文档至关重要[^3]。 --- ### 注意事项 - 如果输入并非真正的二进制编码而是普通的 UTF-8 编码文本描述,则需先对其进行适当解码再转为 bytes 类型。 - 对于非常大的 Excel 文件来说,这种方法可能会占用较多内存资源,因为它是在 RAM 中构建临时副本来进行处理[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值