我在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'
我要使用pandas
:
value = pandas.read_csv(csvfile, sep = '\t', skiprows = 3).set_index('maturity')
获得如下表:
,然后将第一个columan maturity
设置为索引。
但是csvfile中有几个不确定因素:
1。.set_index('maturity')
,密钥maturity
key: maturity
行中包含索引索引。然后,我应该找到行key: xxxx
并获得字符串xxxx
不确定。 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'
来自StringIO
:data
data.getvalue() = 'Idnum\tId\nkey:maturity\n2\nmaturity\tpara1\tpara2\n1Y\t0\t0\n2Y\t0\t0'
我对这种结构不熟悉,甚至我也想通过使用以下命令获得原始data
的表格,而没有任何版本:
value = pandas.read_csv(data, sep = '\t')
会有错误。
答案 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)