【发布时间】:2020-08-17 17:39:20
【问题描述】:
我正在寻找一种方法来清理 4000 个类似格式但具有不同数量的行/列的 csv,然后将它们组合成一个表(可能是 SQLite 超过 400 万条记录)。数据是相关的始发地/目的地 (O/D) 调查 - 每个 csv 是包含多个停靠站到停靠站计数的特定路线和票证类型(例如路线 101 成人、路线 101 孩子 wkend 等)。每个 csv 都采用类似的阶梯式格式,其中 csv 具有与列相同的行数(如果不包括第一行(路线信息)):
route info
stop1, stop1
stop2, value, stop2
stop3, value, value, stop3
stop4, value, value, value, stop4
或
route info
stop11, stop11
stop32, value, stop32
....
stop150, value, value, value, ......., stop150
但是,每个 csv 可以有不同/更多/更少的 O/D 组合。数据没有标题,因此很难进入我建议的“中间步骤”。
Intermediary cleaning step - not required if can go directly to final output
我才刚刚开始寻找解决方案,但在将数据加载到 Pandas DataFrame 时遇到了问题:
- CParserError:错误标记数据。 C 错误:第 3 行中应有 2 个字段,看到 3。 (使用 sep = "\t" 更正)
- 在单列中看到的所有数据(通过首先使用 csv.reader 打开数据以获取列数并为每个列分配一个数字来更正)
for dirty_csv in csvs_to_be_cleaned:
print (dirty_csv)
# open csv to get number of columns so that Pandas can read data
with open(dirty_csv, 'r') as csvfile:
reader = csv.reader(csvfile)
# subtract 1 from length to get actual number of columns
# first row contains route/ticket info (which will be populated in 2 new fields)
col_range = len(list(reader)) - 1
default_cols = [str(i) for i in range(col_range)] # create some col names
df = pd.read_csv(dirty_csv, sep = "\t", delimiter=",", names = default_cols, header = None)
print(df)
问题:
- 是否有更优雅的解决方案让 Pandas 查看 csv 中的所有数据,其中数据/标题以阶梯方式呈现
- Pandas 可以使用列中的第一个字符串条目作为列标题吗?
我想知道是否有类似的解决方案或有人愿意提供帮助。
python 模块/进程:
- glob 清理所有 csvs
- 使用 csv/pandas 处理每个 csv 个体(完整的解决方案未写入 atm)
- 将清理后的 csv 输出到新文件夹
- 全部合并到单个 SQLite 表中
【问题讨论】: