如何使用 Pandas read_csv解析云 SQL CSV 导出空值 ("N")



使用 Airflow,我们将数据从 Google Cloud SQL 导出到 CSV,并最终将该 CSV 加载到不同的 SQL 仓库中。但是,Cloud SQL 会将空值导出为字符串"N(这是一个已知的 Google 问题:https://issuetracker.google.com/issues/64579566(。作为临时步骤,我们需要打开文件并删除"N。 csv 中也有实际的字符串,通常使用"

理想情况下,我们可以用熊猫来做到这一点 - 我们设置为在下一步中使用数据帧。 但是,我无法read_csv将"N解释为空值。 这是我尝试过的基本命令:

df = pd.read_csv(filepath, na_values='"N')

我也尝试过na_values=""N",但这给了我相同的结果。

似乎read_csv首先检查字符串,然后检查空值,所以我得到的输出如下所示:

Id                                                                           100
IncidentDate                                                 2018-08-29 07:00:00
StudentInvolved                                                      Psueudonym
IncidentLocation                                                       Classroom
IncidentCategory                                             Academic dishonesty
IncidentDescriptionDetails     [TESTING] How does this insert into table when...
FollowUp                                                                       0
ConsequenceGiven                                             Afterschool Academy
ConsequenceStartDate                                                         N,N
ConsequenceEndDate                                                           N,N
PrimaryViolation                                                 <email address>
Weapon                                                             <school_name>
CreatedBy                                                                    N,N
SiteName                                                                    1000
DisciplinaryActionAuthority                                                N,0,N
DocumentationUrl                                                             N,N
SIS_ID                                                                       N,N
SubmittedBy                                                                  N,N
Deleted                                                                      N,N
FollowUpNotes                                                                N,N
StudentLists_fk                                                              N,N

关于read_csv是否能够解析它的任何想法?

您需要在加载到 pandas 数据帧之前替换该值。一种方法是在 Linux 中使用sed命令。

sed 's/"N/NULL/g' <filename>.csv

然后加载到熊猫中

自动执行导出语句:

folderName=`date +%m-%d-%Y`
fileName=`date +%H:%M:%S`
gs_path="gs://generic_test/$folderName/$fileName.csv"
gcloud sql export csv upc-asin-mapping $gs_path --query="select * from tableName;" --database=db_name
gsutil -m cp $gs_path .
sed -i "" 's/"N/NULL/g' $fileName.csv
gsutil -m cp $fileName.csv $gs_path

上面的脚本会下载文件,将"N替换为NULL,然后重新上传同名的同一文件。 这不是一种可扩展的方法。

最终不得不通过替换文本来暴力破解它。

with open(filepath, 'r', encoding="utf-8") as inputFile:
raw_text = inputFile.read()
edited_text = raw_text.replace('"N,', ',')
edited_text = edited_text.replace(',"Nn', ',n')
with open(edited_filepath, 'w', newline='n', encoding="utf-8") as outputFile:
outputFile.write(edited_text)
df = pd.read_csv(edited_filepath, names=incident_columns)

一个缺点是这会弄乱任何合法以N,Nn开头的字符串,但希望我们的用户没有输入这样东西的习惯。

相关内容

  • 没有找到相关文章

最新更新