如何处理分段格式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
相关产品推荐
相关产品推荐

