使用pandas读取csv文件,列用不同数量的空格和逗号分隔

2 投票
2 回答
2433 浏览
提问于 2025-05-10 21:09

我想把一个CSV文件读成一个pandas的数据框。这个CSV文件在这里:https://www.dropbox.com/s/o3xc74f8v4winaj/aaaa.csv?dl=0

具体来说,

  1. 我想跳过第一行

  2. 列的标题在第二行。在这种情况下,它们是:1, 1, 2 和 TOT。不过我不想把这些标题写死在代码里。如果只提取TOT这一列也没问题。

  3. 如果可以的话,我不想用非pandas的方法。

这是我现在的做法:

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           

相关文章:

  • 暂无相关问题
暂无标签

2 个回答

2

你需要指定列的名称。注意我用的一个小技巧,让两个列的名字都叫1(一个是整数类型的名字,另一个是文本类型的名字)。

由于数据结构很糟糕,这样做并不完美(注意第二行,BD和33kpa因为中间的空格被分开了)。

pd.read_csv('/Downloads/aaaa.csv', 
            skiprows=2, 
            skipinitialspace=True, 
            sep=' ', 
            names=['Index', 'Description',1,"1",2,'TOT'], 
            index_col=0)

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

或者你可以重置索引。

>>> (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
3

你可以指定一个正则表达式作为分隔符。在你的情况下,可以使用 [\s,]{2,20},也就是说,它会匹配两个或更多的空格或逗号:

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

撰写回答