Python 使用熊猫读取csv文件,其中列由不同数量的空格和逗号分隔

Python 使用熊猫读取csv文件,其中列由不同数量的空格和逗号分隔,python,pandas,Python,Pandas,我想将csv文件作为数据帧读取。CSV文件位于此处: 特别是, 我想跳过第一排 列标题位于第2行。在本例中,它们是:1、1、2和TOT。但我不想硬编码它们。如果提取的唯一列是TOT,则可以 如果可能的话,我不想使用非熊猫的方法 以下是我正在做的: df = pandas.read_csv('https://www.dropbox.com/s/o3xc74f8v4winaj/aaaa.csv?dl=0', skiprows=1, skipinitialspace=True, sep=' ') 但

我想将csv文件作为数据帧读取。CSV文件位于此处:

特别是,

  • 我想跳过第一排

  • 列标题位于第2行。在本例中,它们是:1、1、2和TOT。但我不想硬编码它们。如果提取的唯一列是TOT,则可以

  • 如果可能的话,我不想使用非熊猫的方法

  • 以下是我正在做的:

    df = pandas.read_csv('https://www.dropbox.com/s/o3xc74f8v4winaj/aaaa.csv?dl=0', skiprows=1, skipinitialspace=True, sep=' ')
    
    但这就产生了错误:

    *** CParserError: Error tokenizing data. C error: Expected 5 fields in line 4, saw 6
    
    输出应如下所示:

                        1       1       2     TOT
    0   DEPTH(m)        0.01    1.24    1.52    
    1   BD  33kpa(t/m3) 1.6     1.6     1.6
    2   SAND(%)         42.1    42.1    65.1    
    3   SILT(%)         37.9    37.9    16.9    
    4   CLAY(%)         20      20      18  
    5   ROCK(%)         12      12      12  
    6   WLS(kg/ha)      0       5       0.1    5.1
    7   WLM(kg/ha)      0       5       0.1    5.1
    8   WLSL(kg/ha)     0       4       0.1    4.1
    9   WLSC(kg/ha)     0       2.1     0      2.1
    10  WLMC(kg/ha)     0       2.1     0      2.1
    11  WLSLC(kg/ha)    0       1.7     0      1.7
    12  WLSLNC(kg/ha)   0       0.4     0      0.4
    13  WBMC(kg/ha)     9       1102.1  250.9   1361.9
    14  WHSC(kg/ha)     69      8432    1920    10420
    15  WHPC(kg/ha)     146     18018   4102    22266
    16  WOC(kg/ha)      224     27556   6272    34
    17  WLSN(kg/ha)     0       0       0       0
    18  WLMN(kg/ha)     0       0.2     0       0.2
    19  WBMN(kg/ha)     0.9     110.2   25.1    136.2
    20  WHSN(kg/ha)     7       843     192     1042
    21  WHPN(kg/ha)     15      1802    410     2227
    22  WON(kg/ha)      22      2755    627     3405
    23  CFEM(kg/ha)     0           
    

    您需要指定列的名称。请注意我用来获取两个名为1的列(一个是整数名,另一个是文本)的技巧

    考虑到数据的结构有多么糟糕,这并不是完美的(注意第2行,其中BD和33kpa由于它们之间的空间而被分割)

    或者您可以重置索引

    >>> (pd.read_csv('/Downloads/aaaa.csv', 
                     skiprows=2, 
                     skipinitialspace=True, 
                     sep=' ', 
                     names=['Index', 'Description',1,"1",2,'TOT'], 
                     index_col=0)
         .reset_index(drop=True)
         .dropna(axis=0, how='all'))
    
              Description            1         1        2      TOT
        0        DEPTH(m)         0.01      1.24     1.52      NaN
        1              BD  33kpa(t/m3)      1.60     1.60      1.6
        2         SAND(%)         42.1     42.10    65.10      NaN
        3         SILT(%)         37.9     37.90    16.90      NaN
        4         CLAY(%)         20.0     20.00    18.00      NaN
        5         ROCK(%)         12.0     12.00    12.00      NaN
        6      WLS(kg/ha)          0.0      5.00     0.10      5.1
        7      WLM(kg/ha)          0.0      5.00     0.10      5.1
        8     WLSL(kg/ha)          0.0      4.00     0.10      4.1
        9     WLSC(kg/ha)          0.0      2.10     0.00      2.1
        10    WLMC(kg/ha)          0.0      2.10     0.00      2.1
        11   WLSLC(kg/ha)          0.0      1.70     0.00      1.7
        12  WLSLNC(kg/ha)          0.0      0.40     0.00      0.4
        13    WBMC(kg/ha)          9.0   1102.10   250.90   1361.9
        14    WHSC(kg/ha)          69.   8432.00  1920.00  10420.0
        15    WHPC(kg/ha)         146.  18018.00  4102.00  22266.0
        16     WOC(kg/ha)         224.  27556.00  6272.00     34.0
        17    WLSN(kg/ha)          0.0      0.00     0.00      0.0
        18    WLMN(kg/ha)          0.0      0.20     0.00      0.2
        19    WBMN(kg/ha)          0.9    110.20    25.10    136.2
        20    WHSN(kg/ha)           7.    843.00   192.00   1042.0
        21    WHPN(kg/ha)          15.   1802.00   410.00   2227.0
        22     WON(kg/ha)          22.   2755.00   627.00   3405.0
        23    CFEM(kg/ha)           0.       NaN      NaN      NaN
    

    您可以指定一个正则表达式用作分隔符,在您的情况下,它将与
    [\s,]{2,20}
    一起使用,即2个或更多空格或逗号:

    In [180]: pd.read_csv('aaaa.csv', 
                          skiprows = 1, 
                          sep='[\s,]{2,20}',
                          index_col=0)
    Out[180]:
             Unnamed: 1       1       1.1        2      TOT
    0
    1          DEPTH(m)    0.01      1.24     1.52      NaN
    2    BD 33kpa(t/m3)    1.60      1.60     1.60      NaN
    3           SAND(%)   42.10     42.10    65.10      NaN
    4           SILT(%)   37.90     37.90    16.90      NaN
    5           CLAY(%)   20.00     20.00    18.00      NaN
    6           ROCK(%)   12.00     12.00    12.00      NaN
    7        WLS(kg/ha)    0.00      5.00     0.10      5.1
    8        WLM(kg/ha)    0.00      5.00     0.10      5.1
    9       WLSL(kg/ha)    0.00      4.00     0.10      4.1
    10      WLSC(kg/ha)    0.00      2.10     0.00      2.1
    11      WLMC(kg/ha)    0.00      2.10     0.00      2.1
    12     WLSLC(kg/ha)    0.00      1.70     0.00      1.7
    13    WLSLNC(kg/ha)    0.00      0.40     0.00      0.4
    14      WBMC(kg/ha)    9.00   1102.10   250.90   1361.9
    15      WHSC(kg/ha)   69.00   8432.00  1920.00  10420.0
    16      WHPC(kg/ha)  146.00  18018.00  4102.00  22266.0
    17       WOC(kg/ha)  224.00  27556.00  6272.00     34.0
    18      WLSN(kg/ha)    0.00      0.00     0.00      0.0
    19      WLMN(kg/ha)    0.00      0.20     0.00      0.2
    20      WBMN(kg/ha)    0.90    110.20    25.10    136.2
    21      WHSN(kg/ha)    7.00    843.00   192.00   1042.0
    22      WHPN(kg/ha)   15.00   1802.00   410.00   2227.0
    23       WON(kg/ha)   22.00   2755.00   627.00   3405.0
    24      CFEM(kg/ha)    0.00       NaN      NaN      NaN
    25,            None     NaN       NaN      NaN      NaN
    26,            None     NaN       NaN      NaN      NaN
    

    行w索引1似乎有更多的列。注意如果你用空格作为定界符,如果你有带空格的非引号的单词。是的,那一行有
    bd33kpa(t/m3)
    。这应该是一个单词,但文件中有一个空格。如果跳过或忽略该行,我就可以了。那么,原始文件中是否有引号让解析器能够区分BTW空格和分隔符空格呢?@ako,不幸的是,没有:(谢谢@Alexander,这太棒了。但是,在我的问题中,我不想硬编码列名,因为不同的文件有不同的列数。唯一可以确定的列是
    TOT
    ,如果您提取的唯一列是
    TOT
    @user308827如果您想使用Pandas进行此操作,您至少可以需要知道要读取的列数。此数据格式非常糟糕。正则表达式语法
    {a,b}
    的意思是“在前面事情的a和b重复之间”,我只是选择20作为任意最大值,但我选择2作为最小值,以确保“BD 33kpa(t/m3)”不会被拆分
    In [180]: pd.read_csv('aaaa.csv', 
                          skiprows = 1, 
                          sep='[\s,]{2,20}',
                          index_col=0)
    Out[180]:
             Unnamed: 1       1       1.1        2      TOT
    0
    1          DEPTH(m)    0.01      1.24     1.52      NaN
    2    BD 33kpa(t/m3)    1.60      1.60     1.60      NaN
    3           SAND(%)   42.10     42.10    65.10      NaN
    4           SILT(%)   37.90     37.90    16.90      NaN
    5           CLAY(%)   20.00     20.00    18.00      NaN
    6           ROCK(%)   12.00     12.00    12.00      NaN
    7        WLS(kg/ha)    0.00      5.00     0.10      5.1
    8        WLM(kg/ha)    0.00      5.00     0.10      5.1
    9       WLSL(kg/ha)    0.00      4.00     0.10      4.1
    10      WLSC(kg/ha)    0.00      2.10     0.00      2.1
    11      WLMC(kg/ha)    0.00      2.10     0.00      2.1
    12     WLSLC(kg/ha)    0.00      1.70     0.00      1.7
    13    WLSLNC(kg/ha)    0.00      0.40     0.00      0.4
    14      WBMC(kg/ha)    9.00   1102.10   250.90   1361.9
    15      WHSC(kg/ha)   69.00   8432.00  1920.00  10420.0
    16      WHPC(kg/ha)  146.00  18018.00  4102.00  22266.0
    17       WOC(kg/ha)  224.00  27556.00  6272.00     34.0
    18      WLSN(kg/ha)    0.00      0.00     0.00      0.0
    19      WLMN(kg/ha)    0.00      0.20     0.00      0.2
    20      WBMN(kg/ha)    0.90    110.20    25.10    136.2
    21      WHSN(kg/ha)    7.00    843.00   192.00   1042.0
    22      WHPN(kg/ha)   15.00   1802.00   410.00   2227.0
    23       WON(kg/ha)   22.00   2755.00   627.00   3405.0
    24      CFEM(kg/ha)    0.00       NaN      NaN      NaN
    25,            None     NaN       NaN      NaN      NaN
    26,            None     NaN       NaN      NaN      NaN