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)