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.0、390.1、390.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
最近我很难用 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.0、390.1、390.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