Pandas read_csv:小数点和分隔符是同一个字符

Pandas read_csv: decimal and delimiter is the same character

最近我很难用 pandas pd.read_csv 读取一个 csv 文件。 问题是,在 csv 文件中,逗号既用作小数点又用作列的分隔符。 csv 如下所示:

wavelength,intensity
390,0,382
390,1,390
390,2,400
390,3,408
390,4,418
390,5,427
390,6,437
390,7,447
390,8,457
390,9,468

Pandas 因此总是将数据分成三个单独的列。但是第一个逗号只是小数点。 我想用 390.0390.1390.2 nm 的波长(x 轴)绘制它等等。

我必须以某种方式告诉 pandas,行中的第一个逗号是小数点,第二个是分隔符。 我该怎么做?

最佳

我不确定这是否可能。它 almost 是,如下例所示:

>>> pd.read_csv('test.csv', engine='python', sep=r',(?!\d+$)')
   wavelength intensity
0         390     0,382
1         390     1,390
2         390     2,400
3         390     3,408
4         390     4,418
5         390     5,427
6         390     6,437
7         390     7,447
8         390     8,457
9         390     9,468

...但是错误的逗号被分割了。我会继续尝试看看是否可行 ;)

同时,一个简单的解决方案是利用 pandas 将第一列的一部分放入索引这一事实:

df = (pd.read_csv('test.csv')
    .reset_index()
    .assign(wavelength=lambda x: x['index'].astype(str) + '.' + x['wavelength'].astype(str))
    .drop('index', axis=1)
    .astype({'wavelength': float}))

输出:

>>> df
   wavelength  intensity
0       390.0        382
1       390.1        390
2       390.2        400
3       390.3        408
4       390.4        418
5       390.5        427
6       390.6        437
7       390.7        447
8       390.8        457
9       390.9        468

编辑:有可能!

下面的正则表达式加一点 column-wise 就搞定了:

df = pd.read_csv('test.csv', engine='python', sep=r',(!?\w+)$').dropna(axis=1, how='all')

输出:

>>> df
  wavelength  intensity
0      390,0        382
1      390,1        390
2      390,2        400
3      390,3        408
4      390,4        418
5      390,5        427
6      390,6        437
7      390,7        447
8      390,8        457
9      390,9        468