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)

代码解释:

  1. 导入库: 首先,导入 pandas 库,用于处理 DataFrame 数据。
  2. 创建 DataFrame: 创建一个包含 At 两列的 DataFrame。A 列包含需要格式化的字符串,t 列是辅助信息。
  3. 定义格式化函数 format_string
    • 将字符串按 - 切分成列表 s
    • 创建一个新的列表 new_s 用于存储格式化后的字符串。
    • 遍历 s 中的每个元素,对元素进行如下操作:
      • 如果元素长度小于 4,则在前面补 0,使其长度为 4。
      • 如果当前元素不是第一个元素,并且当前元素的前两位与前一个元素的前两位不一致,则在 new_s 中添加 / 连接符。
      • 如果当前元素是最后一个元素,并且 new_s 中存在连接符,则删除最后一个连接符(因为最后一个元素不需要加 -)。
      • 将当前元素添加到 new_s 中。
    • 使用 '-'.join(new_s)new_s 中的元素用 - 连接起来,并返回最终格式化的字符串。
  4. 应用格式化函数: 使用 df['A'].apply(format_string)format_string 函数应用于 A 列的所有元素,并将结果存储在新的 B 列中。
  5. 打印结果: 打印格式化后的 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

改进后的代码解决了原始代码中/前后多了一个-的问题。

Pandas DataFrame 数据格式化:按分隔符切分并连接元素

原文地址: https://www.cveoy.top/t/topic/n3Ui 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录