Python中列名及其对应行的对齐

时间:2019-06-26 15:33:53

标签: python pandas dataframe

我有一个CSV file,它在列和行对齐方面非常混乱。在第一个单元格中,说明了所有列名,但它们与下面的行不对齐。因此,当我在python using pandas中加载此CSV文件时 see picture 1

我没有干净的数据框

see picture 2

在下面的图片中,有一个示例,显示的是将列分隔并匹配行的样子。

picture 3


一些细节:

几行原始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

希望这可以使话题和问题有所澄清。所需的输出是组织良好的数据帧,其中列基于分隔符“;”与行匹配

1 个答案:

答案 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