wp231957 发表于 2024-7-24 10:41:40

FishC 发表于 2024-7-24 10:33
明白了!为了处理这个问题,我们需要更细致的条件判断,确保在处理 `numeric_parts` 时不会尝试对 `flo ...

我怀疑pandas 是不是默认12,234.56这样的数据就是浮点型数据根本就不用去逗号

FishC 发表于 2024-7-24 10:41:53

wp231957 发表于 2024-07-24 10:41
我怀疑pandas 是不是默认12,234.56这样的数据就是浮 ...

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

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

import pandas as pd
import numpy as np
import re

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

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

def process_row(value):
    # 将当前值转换为字符串,如果是 NaN 则返回空字符串
    current_value = str(value) if pd.notna(value) else ""

    # 初始化返回的部分
    numeric_parts = []
   
    # 使用正则表达式提取所需的信息
    first_part_match = re.match(r"\d+", current_value)
    first_part = first_part_match.group() if first_part_match else np.nan# 提取第一个数字
   
    # 提取数值部分
    numeric_parts = re.findall(r"\d{1,3}(?:,\d{3})*(?:\.\d{2})|\d+\.\d{2}", current_value)# 提取数字部分

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

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

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

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

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

# 打印结果
print(df2)

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

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

小肥狼haoran 发表于 2024-7-24 11:07:39

data_str = "519889,汇添富收益快线货币B,24,626.14,24,914.25,8,209.63,82.10"
data_list = data_str.split(',')
code = data_list.pop(0)
name = data_list.pop(0)
print(code)
print(name)
# 遍历删过数据的列表, 通过值的长度判断 是否需要和前一个下标str数字组合
for index, value in enumerate(data_list):
    if len(value) == 6:# 如果值的长度达到6位数,就和前面的str数字拼接起来,并单独输出
      number = data_list + data_list
      print(number)
    elif '.' in value and len(value) < 6:# 判断值是否包含小数点和长度小于6位数,符合条件就输出
      print(value)
以上代码是再python3中实现的,满足了楼主的要求

cjjJasonchen 发表于 2024-7-24 12:01:04

data = "519889,汇添富收益快线货币B,24,626.14,24,914.25,8,209.63,82.10"

data = data.split(',')
num_list = []
for index in range(len(data)):
    try:
      num = eval(data)
      if len(data) > 3:
            if type(num) == int:
                num_list.append(str(num))
    except:
      num_list.append(data)
    if '.' in data:
      if len(data.split(".")) == 3:
            num = data +','+ data
      else:
            num = data   
      num_list.append(num)

print(num_list)
页: 1 2 [3]
查看完整版本: 如何拆分带逗号的字符串