鱼C论坛

 找回密码
 立即注册
123
返回列表 发新帖
楼主: wp231957

[已解决]如何拆分带逗号的字符串

[复制链接]
 楼主| 发表于 2024-7-24 10:41:40 | 显示全部楼层
FishC 发表于 2024-7-24 10:33
明白了!为了处理这个问题,我们需要更细致的条件判断,确保在处理 `numeric_parts` 时不会尝试对 `flo ...

我怀疑pandas 是不是默认12,234.56  这样的数据就是浮点型数据  根本就不用去逗号
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-24 10:41:53 | 显示全部楼层
wp231957 发表于 2024-07-24 10:41
我怀疑pandas 是不是默认12,234.56  这样的数据就是浮 ...


是的,您说得对!`pandas` 默认将包含小数的数字字符串(如 `"12,234.56"`)解析为浮点型数据,而不需要进行额外的格式化。因此,在处理这些字符串时,我们应该确保在提取出数字后,不要再误将它们视为字符串来去掉逗号。

### 这里是一个更新后的代码,可以更好地处理这种情况:

  1. import pandas as pd
  2. import numpy as np
  3. import re

  4. # 导入数据
  5. dfa = pd.read_excel('shujufenge2.xlsx')

  6. # 假设列名为 'value'
  7. # 如果存在标题行,确保只读取相应的列
  8. dfa.columns = [ 'value']  # 可以根据实际情况设置列名

  9. def process_row(value):
  10.     # 将当前值转换为字符串,如果是 NaN 则返回空字符串
  11.     current_value = str(value) if pd.notna(value) else ""
  12.   
  13.     # 初始化返回的部分
  14.     numeric_parts = []
  15.    
  16.     # 使用正则表达式提取所需的信息
  17.     first_part_match = re.match(r"\d+", current_value)
  18.     first_part = first_part_match.group() if first_part_match else np.nan  # 提取第一个数字
  19.    
  20.     # 提取数值部分
  21.     numeric_parts = re.findall(r"\d{1,3}(?:,\d{3})*(?:\.\d{2})|\d+\.\d{2}", current_value)  # 提取数字部分

  22.     # 处理 numeric_parts
  23.     processed_numeric_parts = []
  24.     for part in numeric_parts:
  25.         try:
  26.             # 直接转换为 float,pandas 已经处理了千分位逗号
  27.             processed_numeric_parts.append(float(part.replace(",", "")))
  28.         except ValueError:
  29.             # 如果无法转换,则添加 NaN
  30.             processed_numeric_parts.append(np.nan)

  31.     # 确保 processed_numeric_parts 的长度是 4,短缺的部分用 NaN 填充
  32.     while len(processed_numeric_parts) < 4:
  33.         processed_numeric_parts.append(np.nan)

  34.     # 返回结果,包括第一个部分和处理后的数值部分
  35.     return [first_part] + processed_numeric_parts  # 使用列表返回

  36. # 应用处理函数到每一行
  37. df2 = dfa['value'].apply(process_row).apply(pd.Series)  # 只应用于 'value' 列

  38. # 给新 DataFrame 设置列名(可选)
  39. df2.columns = ['First Part', 'Num1', 'Num2', 'Num3', 'Num4']

  40. # 打印结果
  41. print(df2)

  42. # 如果需要导出到新的表格
  43. df2.to_excel('output.xlsx', index=False)  # 导出为 Excel 文件
复制代码


### 说明:
1. **直接处理数值**:在 `numeric_parts` 中提取的数字,`pandas` 对于浮点数已经处理好了不需要去掉逗号,只需直接转换成 `float`。
2. **使用正则表达式**:我们使用正则表达式提取所有符合条件的数字,然后尝试将其转换为浮点数,任何无法转换的部分将被标记为 `NaN`。
3. **确保长度一致性**:通过填充 `NaN` 来确保返回的数字部分总是有 4 个元素。

这样能保持代码的整洁性,同时避免不必要的错误。如果你还有其他问题,请随时告诉我!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-24 11:07:39 | 显示全部楼层
  1. data_str = "519889,汇添富收益快线货币B,24,626.14,24,914.25,8,209.63,82.10"
  2. data_list = data_str.split(',')
  3. code = data_list.pop(0)
  4. name = data_list.pop(0)
  5. print(code)
  6. print(name)
  7. # 遍历删过数据的列表, 通过值的长度判断 是否需要和前一个下标str数字组合
  8. for index, value in enumerate(data_list):
  9.     if len(value) == 6:  # 如果值的长度达到6位数,就和前面的str数字拼接起来,并单独输出
  10.         number = data_list[index-1] + data_list[index]
  11.         print(number)
  12.     elif '.' in value and len(value) < 6:  # 判断值是否包含小数点和长度小于6位数,符合条件就输出
  13.         print(value)
复制代码
以上代码是再python3中实现的,满足了楼主的要求
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-24 12:01:04 | 显示全部楼层
  1. data = "519889,汇添富收益快线货币B,24,626.14,24,914.25,8,209.63,82.10"

  2. data = data.split(',')
  3. num_list = []
  4. for index in range(len(data)):
  5.     try:
  6.         num = eval(data[index])
  7.         if len(data[index]) > 3:
  8.             if type(num) == int:
  9.                 num_list.append(str(num))
  10.     except:
  11.         num_list.append(data[index])
  12.     if '.' in data[index]:
  13.         if len(data[index].split(".")[0]) == 3:
  14.             num = data[index-1] +','+ data[index]
  15.         else:
  16.             num = data[index]   
  17.         num_list.append(num)

  18. print(num_list)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-21 15:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表