我有一个csv,我需要将其导入到pandas数据框。然后,我需要将该熊猫数据帧导出回与导入的csv完全相同的csv(输入文件和输出文件必须完全匹配)。
我遇到的问题是csv的格式非常奇怪,我无法更改此格式(这是挑战的一部分)。 csv的某些行具有不同数量的元素,而某些行以2个分号,一个分号或没有分号结尾。
input.csv
scene;1
date;08.04.2019;;
sky;AM;45;
sky;PM;45;
weight;upper;-5
到目前为止,我已经完成了最简单的操作-我已使用以下代码将csv导入到pandas数据框中:
def csv_read(path):
df = pd.read_csv(path, sep = ";",
header = None,
names = ['a', 'b', 'c', 'd'])
print(df)
csv_read(input.csv)
我苦苦挣扎的一点是如何将数据框导出为与input.csv相同的格式。我正在尝试将to_csv与一些精心设计的参数一起使用,但是我不确定这是否是正确的方法?这是我到目前为止所写的。
df.to_csv("output.csv",
sep = ";")
这将输出:
scene;1;;
date;08.04.2019;;
sky;AM;45;
sky;PM;45;
weight;upper;-5;
因此,第1,2和4行与input.csv不匹配。任何关于最佳方法的帮助/指导将不胜感激!我认为最好的方法可能是建立一些规则。例如如果行以场景开头,则不要在结尾添加任何分号。但是我不确定这是最好的方法还是最优雅的解决方案。
为了便于复制,我将input.csv放在了单个命令中:
df = pd.DataFrame(np.array([["scene", "1", "NaN", "NaN"],
["date", "08.04.2019", "NaN", "NaN"],
["sky", "AM", 45, "NaN"],
["sky", "PM", 45, "NaN"],
["weight", -5, "NaN", "NaN"],]))
答案 0 :(得分:1)
我唯一想做的就是使用csv
模块读取熊猫的csv输出,然后用所需的定界符格式重写文件。
import csv
import pandas as pd
import numpy as np
df = pd.DataFrame(np.array([["scenario", "scen1", "NaN", "NaN"],
["date", "08.04.2019", "NaN", "NaN"],
["turnaround time", "BAH", 45, "NaN"],
["turnaround time", "AMM", 45, "NaN"],
["weight", -5, "NaN", "NaN"],]))
df = df.replace("NaN", '', regex=True)
df.to_csv('out.csv',sep = ';',index=False, header=False)
with open('out.csv','r') as csvfile:
data = csvfile.readlines()
with open('out.csv','w') as rewrite:
for row in data:
if row.find('weight')>-1:
row = row[:-3]
if row.find('scenario')>-1:
row = row.replace(';;','')
rewrite.write(row)
返回以下行的csv文件out.csv
:
scenario;scen1
date;08.04.2019;;
turnaround time;BAH;45;
turnaround time;AMM;45;
weight;-5
答案 1 :(得分:0)
如果问题是保存的csv文件与原始文件不匹配,则可能要使用:
df.to_csv("output.csv", sep = ";", index = False)
当我使用上述方法保存csv并使用df1 = pd.read_csv("output.csv")
重新加载csv时,这两个数据帧是相同的。