我有一个CSV file
,它在列和行对齐方面非常混乱。在第一个单元格中,说明了所有列名,但它们与下面的行不对齐。因此,当我在python using pandas
中加载此CSV文件时
我没有干净的数据框
在下面的图片中,有一个示例,显示的是将列分隔并匹配行的样子。
一些细节:
几行原始CSV文件:
Columns:
VMName;"Cluster";"time";"AvgValue";"MinValue";"MaxValue";"MetricId";"MemoryMB";"CpuMHz";"NumCpu"
Rows:
ITLT4301;1;"1-5-2018";976439;35059255;53842;6545371441;3235864;95200029;"MemActive";"4096";"0";"0"
代码:
df = pd.read_csv(file_location, sep=";")
在python中加载数据框时的输出:
VMName;"Cluster";"time";"AvgValue";"MinValue";"MaxValue";"MetricId";"MemoryMB";"CpuMHz";"NumCpu",,,
ITLT4301;1;"1-5-2018";976439,35059255 53842,6545371441 3235864,"95200029 MemActive"" 4096"" 0"" 0"""
所需的输出:
VMName Cluster time AvgValue MinValue MaxValue MetricId MemoryMB CpuMHz
ITLT4301 1 1-5-201 976439 35059255 53842 6545371441 95200029 MemActive
NumCpu
4096
希望这可以使话题和问题有所澄清。所需的输出是组织良好的数据帧,其中列基于分隔符“;”与行匹配
答案 0 :(得分:1)
您的输入数据文件不是标准的csv文件。正确的方法是修复上一步,以便获得正常的csv文件,而不是用双引号引起的混乱,从而阻止任何体面的csv解析器正确提取数据。
作为一种解决方法,可以删除开头和结尾的双引号,删除任何双打的双引号,并在半列中分割每一行而忽略任何剩余的双引号。可选地,您也可以尝试删除所有双引号并将“;”上的行分开。这实际上取决于您期望什么值。
可能的代码可能是:
def split_line(line):
'''split a line on ; after stripping white spaces, the initial and terminating "
doubles double quotes are also removed'''
return line.strip()[1:-1].replace('""', '').split(';')
with open('file.dat') as fd:
cols = split_line(next(fd)) # extract column names from header line
data = [split_line(line) for line in fd] # process data lines
df = pd.DataFrame(data, columns=cols) # build a dataframe from that
使用该输入:
"VMName;""Cluster"";""time"";""AvgValue"";""MinValue"";""MaxValue"";""MetricId"";""MemoryMB"";""CpuMHz"";""NumCpu"""
"ITLT4301;1;""1-5-2018"";976439" 35059255;53842 6545371441;3235864 "95200029;""MemActive"";""4096"";""0"";""0"""
"ITLT4301;1;""1-5-2018"";98" 9443749608104;29 3435452286154;673 "067568681366;""CpuUsageMHz"";""0"";""5600"";""2"""
它给出:
VMName Cluster time AvgValue MinValue \
0 ITLT4301 1 1-5-2018 976439" 35059255 53842 6545371441
1 ITLT4301 1 1-5-2018 98" 9443749608104 29 3435452286154
MaxValue MetricId MemoryMB CpuMHz NumCpu
0 3235864 "95200029 MemActive 4096 0 0
1 673 "067568681366 CpuUsageMHz 0 5600 2