Pandas DataFrame 数据格式化:按分隔符切分并连接元素
import pandas as pd
df = pd.DataFrame({'A': ['1081-1091-1001-0483-0421', '611-613-639-839-837-833', '23-611-613-639', '23-611-613-639-993', '483-421'],
't': [1, 1, 1, 2, 0]})
def format_string(s):
'''
将字符串按照要求格式化
'''
s = s.split('-')
new_s = []
for i in range(len(s)):
if len(s[i]) < 4:
# 不足四位的数字前面补0
s[i] = s[i].zfill(4)
if i > 0 and s[i][:2] != s[i-1][:2]:
# 相邻两元素前两位不一致时用/连接
new_s.append('/')
if i == len(s)-1 and new_s: # 最后一个元素不需要加-
new_s.pop()
new_s.append(s[i])
return '-'.join(new_s)
df['B'] = df['A'].apply(format_string)
print(df)
代码解释:
- 导入库: 首先,导入
pandas库,用于处理 DataFrame 数据。 - 创建 DataFrame: 创建一个包含
A和t两列的 DataFrame。A列包含需要格式化的字符串,t列是辅助信息。 - 定义格式化函数
format_string:- 将字符串按
-切分成列表s。 - 创建一个新的列表
new_s用于存储格式化后的字符串。 - 遍历
s中的每个元素,对元素进行如下操作:- 如果元素长度小于 4,则在前面补 0,使其长度为 4。
- 如果当前元素不是第一个元素,并且当前元素的前两位与前一个元素的前两位不一致,则在
new_s中添加/连接符。 - 如果当前元素是最后一个元素,并且
new_s中存在连接符,则删除最后一个连接符(因为最后一个元素不需要加-)。 - 将当前元素添加到
new_s中。
- 使用
'-'.join(new_s)将new_s中的元素用-连接起来,并返回最终格式化的字符串。
- 将字符串按
- 应用格式化函数: 使用
df['A'].apply(format_string)将format_string函数应用于A列的所有元素,并将结果存储在新的B列中。 - 打印结果: 打印格式化后的 DataFrame。
运行结果:
A t B
0 1081-1091-1001-0483-0421 1 1081-1091-1001/0483-0421
1 611-613-639-839-837-833 1 0611-0613-0639/0839-0837-0833
2 23-611-613-639 1 0023/0611-0613-0639
3 23-611-613-639-993 2 0023/0611-0613-0639/0993
4 483-421 0 0483-0421
改进后的代码解决了原始代码中/前后多了一个-的问题。
原文地址: https://www.cveoy.top/t/topic/n3Ui 著作权归作者所有。请勿转载和采集!