我正在尝试合并大量的.csv文件。它们都具有相同的表格式,每个表都有60列。我的合并表导致数据正常输出,除了第一行包含640列而不是60列。合并的.csv的其余部分由所需的60列格式组成。不确定合并过程中哪里出错了。
问题行中的第一项是20140308.export.CSV中的第一项,而第二项(从第61列开始)是20140313.export.CSV中的第一项。第一个.csv文件是20140301.export.CSV,最后一个是20140331.export.CSV(YYYYMMDD.export.csv),共有31个.csv文件。这意味着有问题的行由来自不同.csv文件的第一项组成。
数据来自http://data.gdeltproject.org/events/index.html。特别是日期为2014年3月1日至2014年3月31日。检查每个.csv文件的下载情况,会发现每个文件的格式均相同,并使用制表符分隔符和逗号分隔的值。
我使用的代码如下。如果还有其他我可以张贴的内容,请告诉我。所有这些都是通过Jupyter Lab通过Google Cloud Platform运行的。谢谢您的帮助。
import glob
import pandas as pd
file_extension = '.export.CSV'
all_filenames = [i for i in glob.glob(f"*{file_extension}")]
combined_csv_data = pd.concat([pd.read_csv(f, delimiter='\t', encoding='UTF-8', low_memory= False) for f in all_filenames])
combined_csv_data.to_csv('2014DataCombinedMarch.csv')
我使用以下bash代码下载数据:
!curl -LO http://data.gdeltproject.org/events/[20140301-20140331].export.CSV.zip
我使用以下代码解压缩数据:
!unzip -a "********".export.CSV.zip
我使用以下代码将其传输到存储桶:
!gsutil cp 2014DataCombinedMarch.csv gs://ddeltdatabucket/2014DataCombinedMarch.csv
看起来这些CSV文件上没有标题,因此Pandas尝试使用文件中的第一行作为标题。然后,当Pandas尝试将数据帧concat()在一起时,它试图匹配为每个文件推断出的列名。
我想出了如何抑制这种行为:
import glob
import pandas as pd
def read_file(f):
names = [f"col_{i}" for i in range(58)]
return pd.read_csv(f, delimiter='\t', encoding='UTF-8', low_memory=False, names=names)
file_extension = '.export.CSV'
all_filenames = [i for i in glob.glob(f"*{file_extension}")]
combined_csv_data = pd.concat([read_file(f) for f in all_filenames])
combined_csv_data.to_csv('2014DataCombinedMarch.csv')
您可以通过names
参数将自己的列名称提供给Pandas 。在这里,我只是供给col_0
,col_1
,col_2
等的名字,因为我不知道他们应该是什么。如果您知道这些列应该是什么,则应更改该names =
行。
我测试了此脚本,但仅使用2个数据文件作为输入,而不是全部31个。
PS:您是否考虑过使用Google BigQuery来获取数据?在通过该界面之前,我已经与GDELT进行过合作,这很容易。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句