在 Python 中合并 .csv 文件 - 合并文件数据错误 - Jupyter 实验室
Combining .csv Files in Python - Merged File Data Error - Jupyter Lab
我正在尝试合并大量 .csv 文件。它们都具有相同的 table 格式,每个都有 60 列。我的合并 table 结果数据很好,除了第一行包含 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 日至 3 月 31 日的日期。检查每个单独的 .csv 文件的下载显示每个文件的格式相同,使用制表符分隔符和逗号分隔值。
我使用的代码如下。如果还有什么我可以 post,请告诉我。所有这些都是 运行 通过 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 文件上没有 header,因此 Pandas 正在尝试将文件中的第一行用作 header。然后,当 Pandas 尝试将数据帧连接在一起时,它会尝试匹配它为每个文件推断出的列名。
我想出了如何抑制这种行为:
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,它更容易。
我正在尝试合并大量 .csv 文件。它们都具有相同的 table 格式,每个都有 60 列。我的合并 table 结果数据很好,除了第一行包含 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 日至 3 月 31 日的日期。检查每个单独的 .csv 文件的下载显示每个文件的格式相同,使用制表符分隔符和逗号分隔值。
我使用的代码如下。如果还有什么我可以 post,请告诉我。所有这些都是 运行 通过 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 文件上没有 header,因此 Pandas 正在尝试将文件中的第一行用作 header。然后,当 Pandas 尝试将数据帧连接在一起时,它会尝试匹配它为每个文件推断出的列名。
我想出了如何抑制这种行为:
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,它更容易。