You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何处理分段格式CSV并加载到Pandas DataFrame,添加对应Asset列

问题描述

现有如下格式的CSV文件:

Cash
Serial,Date,Balance
1,2021-03-05,34
2,2021-05-04,54
Credit
Serial,Date,Balance
18,2021-03-05,898
21,2021-04-01,654
Savings
Serial,Date,Balance
3,2021-03-18,19384
34,Savings,2021-12-04,472

需要将其转换为结构如下的Pandas DataFrame:

Serial,Asset,Date,Balance
1,Cash,2021-03-05,34
2,Cash,2021-05-04,54
18,Credit,2021-03-05,898
21,Credit,2021-04-01,654
3,Savings,2021-03-18,19384
34,Savings,2021-12-04,472

目前已用以下代码加载文件:

import numpy as np
import pandas as pd

FILE = r"/myfile.csv"

with open(FILE, 'r') as temp_f:
    col_count = [ len(l.split(",")) for l in temp_f.readlines() ]

column_names = [i for i in range(0, max(col_count))]
df = pd.read_csv(FILE, header=None, delimiter=",", names=column_names)
df['Asset'] = np.nan
print(df)

但不知道如何删除包含Serial,Date,Balance的行,以及为Asset列填充对应的资产名称(Cash、Credit等),求解决方法。

解决方案

直接用以下代码完成处理,步骤包含资产填充、无效行删除和异常值修正:

import pandas as pd
import numpy as np

FILE = r"/myfile.csv"

# 读取文件,处理列数不一致的情况
with open(FILE, 'r') as temp_f:
    col_count = [len(l.split(",")) for l in temp_f.readlines()]

max_cols = max(col_count)
df = pd.read_csv(FILE, header=None, delimiter=",", names=[f"col_{i}" for i in range(max_cols)])

# 标记资产名称行(仅第一列有值)并填充Asset列
asset_rows = df.iloc[:, 1:].isna().all(axis=1)
df.loc[asset_rows, 'Asset'] = df.loc[asset_rows, 'col_0']
df['Asset'] = df['Asset'].ffill()  # 向下填充资产名称到后续行

# 删除标题行和资产名称行
df = df[~((df['col_0'] == 'Serial') | asset_rows)].reset_index(drop=True)

# 重命名列
df.rename(columns={
    'col_0': 'Serial',
    'col_1': 'Date',
    'col_2': 'Balance'
}, inplace=True)

# 修正Savings部分的异常行(原数据中34行的Date列错误填充了Savings)
invalid_dates = pd.to_datetime(df['Date'], errors='coerce').isna()
df.loc[invalid_dates, ['Date', 'Balance']] = df.loc[invalid_dates, ['col_3', 'col_2']].values

# 整理最终结构并转换数据类型
final_df = df[['Serial', 'Asset', 'Date', 'Balance']].astype({
    'Serial': int,
    'Balance': int
})

print(final_df)

关键步骤说明:

  • 资产名称填充:通过判断行内除第一列外是否全为空,识别资产名称行,再用ffill()将名称向下传递给所有对应的数据行。
  • 无效行过滤:直接剔除标题行(col_0为Serial)和资产名称行。
  • 异常值修正:检查Date列是否为有效日期,对异常行交换列值,确保数据格式正确。

内容的提问来源于stack exchange,提问作者Bakira

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 16:17:55