【发布时间】:2020-01-24 09:22:20
【问题描述】:
编辑 2: 添加一些示例行以供参考。第一行是列名。
field 1|field 2|field3|id
123|xxx|aaa|118
123|xxx|aaa|56
124|xxx|aaa|184
124|yyy|aaa|156
编辑:
对非 Python 解决方案开放(grep/awk 等都可以)
csv 文件是用竖线分隔的“|”
我需要保留标题
我有 20 个 .gz 文件(每个 ~100MB,已压缩)。每个 .gz 文件中都有一个 csv 文件,其中包含许多列,包括索引列“id”。所有文件中大约有 250 个唯一 ID。
我需要将每个唯一 id 的所有行输出到每个 csv(即应该生成 250 个 csv 文件)。
我应该如何最好地做到这一点?
我目前正在使用 Python,但生成每个 csv 大约需要 1 分钟,我想知道是否有更快的解决方案。
output_folder = 'indiv_ids/'
# get list of files
list_of_files = [filename for filename in os.listdir() if filename.endswith(".gz")]
# get list of unique ids
for i in range(len(list_of_files)):
df = pd.read_csv(list_of_files[i], sep='|', usecols=['id'], dtype=str, engine='c')
id_list = df['id'].unique()
if len(id_list) == 250:
break
# load into a list for each id
list_df = {id:[] for id in id_list}
for filename in list_of_files:
df = pd.read_csv(filename, sep='|', dtype=str, engine='c')
for id in id_list:
df_id = df[df['id'] == id]
list_df[id].append(df_id)
for id in id_list:
# join into one big df
df_full = pd.concat(list_df[id], axis=0)
df_full.to_csv(f'{output_folder}{id}.csv', sep="|", index=False)
【问题讨论】:
-
我的回答解决了您的问题吗?如果是这样,请考虑接受它作为您的答案 - 通过单击计票旁边的空心对勾/复选标记。如果没有,请说出什么不起作用,以便我或其他人可以进一步为您提供帮助。谢谢。 meta.stackexchange.com/questions/5234/…
-
嗨,很抱歉回复晚了 - 除了标题丢失之外,它还有效。如果有任何想法如何将标题保留在每个文件中,请不胜感激?如果没有解决方案,我会接受你的作为答案
标签: python-3.x csv awk grep gzip