在read_csv中为Pandas索引列指定转换器

时间:2016-10-31 17:30:09

标签: pandas

我正在尝试读取索引列中包含十六进制数字的CSV文件:

InputBits, V0, V1, V2, V3
7A, 0.000594457716, 0.000620631282, 0.000569834178, 0.000625374384, 
7B, 0.000601155649, 0.000624282078, 0.000575955914, 0.000632111367, 
7C, 0.000606026872, 0.000629149805, 0.000582689823, 0.000634561234, 
7D, 0.000612115902, 0.000634625998, 0.000584526357, 0.000638235952, 
7E, 0.000615769413, 0.000637668328, 0.000590648093, 0.00064987256, 
7F, 0.000620640637, 0.000643144494, 0.000594933308, 0.000650485013, 

我可以使用以下代码执行此操作:

df = pd.read_csv('data.csv', index_col=False,
                 converters={'InputBits': lambda x: int(x, 16)})
df.set_index('InputBits', inplace=True)

问题是这似乎不必要地笨重。有没有办法做一些与以下相同的事情?

df = pd.read_csv('data.csv', converters={'InputBits': lambda x: int(x, 16)})

此操作失败,因为InputBits现在是第一个带

的数据列
ValueError: invalid literal for int() with base 16: ' 0.000594457716'

1 个答案:

答案 0 :(得分:2)

正如@root在这里指出的那样,这个例子中的问题是标题与列名和列值的错位,它们都有一个尾随逗号。实际上,the documentation处理了这种特定情况:

  

如果在每行末尾有一个带有分隔符的格式错误的文件,您可能会考虑使用index_col = False来强制pandas 而不是使用第一列作为索引(行名称)

此处的解决方案首先运行

sed -i 's/, \r$//' data.csv

摆脱最后的逗号(以及Windows行结尾)。然后,预期的命令几乎开箱即用:

pd.read_csv('data.csv', index_col='InputBits',
             converters={'InputBits': lambda x: int(x, 16)})