使用熊猫读取具有某些不确定因素的csv文件

时间:2019-01-22 17:39:47

标签: pandas csv

我在Find the number of \n before a given word in a long string中问过有关字符串的问题。但是这种方法无法解决我遇到的复杂情况。因此,我想在这里找到Pandas的解决方案。

我有一个csv文件(我只是表示为string):

csvfile = 'Idnum\tId\nkey:maturity\n2\nmaturity\tpara1\tpara2\n1Y\t0\t0\n2Y\t0\t0'

enter image description here

我要使用pandas

value = pandas.read_csv(csvfile, sep = '\t', skiprows = 3).set_index('maturity')

获得如下表:

enter image description here

,然后将第一个columan maturity设置为索引。

但是csvfile中有几个不确定因素:

1。.set_index('maturity'),密钥maturity  key: maturity行中包含索引索引。然后,我应该找到行key: xxxx并获得字符串xxxx

2。skiprows = 3:标题前已跳过的行数: enter image description here

不确定。 csvfile可能类似于:

'Idnum\tId\nkey:maturity\n2\n\n\n\n\n\nmaturity\tpara1\tpara2\n1Y\t0\t0\n2Y\t0\t0'

我应该找到标题的行号(即在行xxxx中以key: xxxx开头的行)。

3。sep = '\t':csv文件可以使用space作为分隔符,例如:

csvfile = 'Idnum Id\nkey: maturity\n2\nmaturity para1 para2\n1Y 0 0\n2Y 0 0'

那么有pandas的通用代码来处理具有上述不确定因素的csvfile吗?

实际上是字符串:

csvfile = 'Idnum\tId\nkey:maturity\n2\nmaturity\tpara1\tpara2\n1Y\t0\t0\n2Y\t0\t0'

来自StringIOdata

data.getvalue() = 'Idnum\tId\nkey:maturity\n2\nmaturity\tpara1\tpara2\n1Y\t0\t0\n2Y\t0\t0'

我对这种结构不熟悉,甚至我也想通过使用以下命令获得原始data的表格,而没有任何版本:

value = pandas.read_csv(data, sep = '\t')

会有错误。

2 个答案:

答案 0 :(得分:2)

您可以逐行阅读文件,收集必要的信息,然后使用适当的参数将其余信息传递给pd.read_csv

from io import StringIO
import re
import pandas as pd

with open('data.csv') as fh:
    key = next(filter(lambda x: x.startswith('key:'), fh)).lstrip('key:').strip()
    header = re.split('[ \t]+', next(filter(lambda x: x.startswith(key), fh)).strip())
    df = pd.read_csv(StringIO(fh.read()), header=None, names=header, index_col=0, sep=r'\s+')

通过StringIO的数据示例:

fh = StringIO('Idnum\tId\nkey:maturity\n2\nmaturity\tpara1\tpara2\n1Y\t0\t0\n2Y\t0\t0')

key = next(filter(lambda x: x.startswith('key:'), fh)).lstrip('key:').strip()
header = re.split('[ \t]+', next(filter(lambda x: x.startswith(key), fh)).strip())
df = pd.read_csv(fh, header=None, names=header, index_col=0, sep=r'\s+')

答案 1 :(得分:0)

如果您不介意两次读取csv文件,可以尝试执行以下操作:

from io import StringIO
csvfile = 'Idnum\tId\nkey:maturity\n2\nmaturity\tpara1\tpara2\n1Y\t0\t0\n2Y\t0\t0'

data = pd.read_csv(StringIO(csvfile), sep='\t', error_bad_lines=False, header=None)
skiprows = len(data)
pd.read_csv(StringIO(csvfile), sep='\t', skiprows=skiprows)

与您其他示例相同:

csvfile = 'Idnum\tId\nkey:maturity\n2\n\n\n\n\n\nmaturity\tpara1\tpara2\n1Y\t0\t0\n2Y\t0\t0'

data = pd.read_csv(StringIO(csvfile), sep='\t', error_bad_lines=False, header=None)
skiprows = len(data)
pd.read_csv(StringIO(csvfile), sep='\t', skiprows=skiprows)

这假设您知道文件的sep

此外,如果您想查找密钥:

csvfile = 'Idnum\tId\nkey:maturity\n2\n\n\n\n\n\nmaturity\tpara1\tpara2\n1Y\t0\t0\n2Y\t0\t0'
data = pd.read_csv(StringIO(csvfile), sep='\t', error_bad_lines=False, header=None)
key = [x.replace('key:','') for x in data[0] if x.find('key')>-1]
skiprows = len(data)

pd.read_csv(StringIO(csvfile), sep='\t', skiprows=skiprows).set_index(key)