重命名非常大的 CSV 数据文件的列 [重复]
Posted
技术标签:
【中文标题】重命名非常大的 CSV 数据文件的列 [重复]【英文标题】:Renaming columns of very large CSV data file [duplicate] 【发布时间】:2020-08-07 21:06:31 【问题描述】:我有一个相当大的数据文件,它有 200% 的可用内存,我想重命名列并将其保存到具有不同名称的新文件中。
当我对一个小样本进行重命名时,事情会按预期工作,即
df = pd.read_csv(path, encoding="ISO-8859-1", engine='python', nrows=10)
print_columns(df)
rename_columns(df)
print_columns(df)
df.to_csv(path_to_save)
这可以按预期工作并重命名列,但仅保存大文件的十行采样。
当加载非常大的文件时,Python 中有几个选项:
1) 逐行读取和处理大文件
我上次是在另一个大文件上这样做的,但是在重命名列时我真的需要这样做吗?
2) 在 pandas 中分块:
chunksize = 100000
for chunk in pd.read_csv(path, chunksize=chunksize, encoding="ISO-8859-1", engine='python'):
print_columns(chunk)
rename_columns(chunk)
print_columns(chunk)
显然,我重命名了每个块,但我遇到的一个大问题是如何以正确的顺序将所有块缝合在一起并保存大块?
3) 实际上是否有一个很好的旧 shell 命令可以更轻松地重命名列?
作为背景,我准备将数据导入数据库,但需要保持源文件原样,从而保存为不同的文件名。
【问题讨论】:
标题通常只是第一行,如果您只需要编辑单行标题但不更改数据,您总是可以在 Python 之外进行,或者手动进行,甚至是 perl /awk/sed 替换。您需要以编程方式进行吗? 如果你想编写所有没有标题的中间块并将它们连接在一起,请使用df.to_csv(... , header=None, mode='a')
,它会执行附加,没有标题。
Marvin.Hansen:如果您不需要 Python/pandas 解决方案,请不要在标题中添加“Python/pandas”。另外,不要edit solutions into the question and change the title to 'SOLVED'。
【参考方案1】:
您能否只编写一个包含列名的单行 csv 文件,然后使用文本编辑器/命令行将其他行放入其中?
import csv
columns = [['A','B','C','D','E']]
file_name = "column_file.csv"
with open(file_name, mode='w') as csv_file:
csv_writer = csv.writer(csv_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
csv_writer.writerow(columns)
现在您有了一个带有列名的 column_file.csv。删除large_file.csv
文件的第一行并将其放入一个名为new_large_file.csv
的新文件中。
sed '1d' large_file.csv > new_large_file.csv
现在将new_large_file.csv
附加到您创建的仅包含列标题的文件中,并将其保存在文件new_large_file.csv
中
cat column_file.csv new_large_file > final_file.csv
应该还是保留原件的副本,以防万一出现问题,希望对您有所帮助。
【讨论】:
Marvin.Hansen:是的,我在 25 分钟前首次发布了该建议,并建议使用 perl/awk/sed 替换。如果您的问题不需要 Python/pandas 解决方案,请相应地对其进行编辑,以免产生误导。 别担心!看看 pandas 的 astype 函数,如果它的数值数据通过读入 32 位与 64 位 int 相比,您可能能够节省一些内存,将来可能有用但必须小心pandas.pydata.org/pandas-docs/stable/reference/api/… WK123 我将您的答案标记为解决方案并相应地更新了问题。本质上,关键是,我必须批量重命名很多列,与 sed 相比,这在 Python 中做得很好。代码中显示的简单重命名函数实际上非常大......然后将新标题与无标题大文件连接起来就是最好的解决方案。非常感谢您的提示。【参考方案2】:对于大文件,使用流编辑器sed 的简单命令行解决方案可能比 python 脚本更快:
sed -e '1 /SFID/ s/Id/IgnoreId/; s/SFID/Id/' -I myfile.csv
这会将第一行中的Id
更改为IgnoreId
,并将SFID
更改为Id
,如果它包含SFID
。如果其他列标题也包含字符串 Id
(例如 ImportantId),那么您必须相应地优化 s
命令中的正则表达式。
【讨论】:
谢谢,现在正在使用 SED 编写批处理脚本。它确实比 Python 更简单、更快。以上是关于重命名非常大的 CSV 数据文件的列 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
是否可以直接重命名存储在 hdf5 文件中的 pandas 数据框的列?