鱼C论坛

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

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

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

我怀疑pandas 是不是默认12,234.56  这样的数据就是浮点型数据  根本就不用去逗号
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 [first_part] + 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[index-1] + data_list[index]
        print(number)
    elif '.' in value and len(value) < 6:  # 判断值是否包含小数点和长度小于6位数,符合条件就输出
        print(value)
以上代码是再python3中实现的,满足了楼主的要求
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[index])
        if len(data[index]) > 3:
            if type(num) == int:
                num_list.append(str(num))
    except:
        num_list.append(data[index])
    if '.' in data[index]:
        if len(data[index].split(".")[0]) == 3:
            num = data[index-1] +','+ data[index]
        else:
            num = data[index]    
        num_list.append(num)

print(num_list)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 23:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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