pandas dataframe read_csv,指定列并将整行保持为字符串

时间:2017-02-09 10:39:01

标签: python pandas import

在pandas read_csv中,有没有办法指定例如。 col1,col15,整线?

我试图从一个文本文件导入大约700000行数据,该文件有帽子'^'作为分隔符,没有文本限定符和回车符作为行分隔符。

从文本文件中我需要第1列第15列,然后是表格/数据框的三列中的整行。

我已经在熊猫中搜索了如何做到这一点,但是不太了解它以获得逻辑。我可以导入所有26列的罚款,但这对我的问题没有帮助。

my_df = pd.read_csv("tablefile.txt", sep="^", lineterminator="\r",  low_memory=False)

或者我可以使用标准python将数据放入表中,但700000行大约需要4个小时。这对我来说太长了。

count_1 = 0
for line in open('tablefile.txt'):
    if count_1 > 70:
        break
    else:
        col1id = re.findall('^(\d+)\^', line)
        col15id = re.findall('^.*\^.*\^(\d+)\^.*\^.*\^.*\^.*\^.*\^.*\^.*\^.*\^.*\^.*\^.*', line)
        line = line.strip()

        count_1 = count_1 + 1

        cur.execute('''INSERT INTO mytable (mycol1id, mycol15id, wholeline) VALUES (?, ?, ?)''', 
        (col1id[0], col15id[0], line, ) )

        conn.commit()
    print('row count_1=',count_1)

在pandas read_csv中,有没有办法指定例如。 col1,col15,整线?

如上所述,col1col15是数字,wholeline是字符串

  • 我不想在导入后重建字符串,因为我可能会在此过程中丢失一些字符。

由于

编辑: 为每一行提交数据库是一段时间。

3 个答案:

答案 0 :(得分:1)

使用一些准分隔符读取整行作为一个df(在im using&下面),然后再次使用usecols读取并指定cols 1和15的索引并将它们加在一起。

my_df_full = pd.read_csv("tablefile.txt", sep="&", lineterminator="\r", low_memory=False)
my_df_full.columns = ['full_line']

my_df_cols = pd.read_csv("tablefile.txt", sep="^", lineterminator="\r", low_memory=False, usecols=[1,15])

my_df_full[['col1', 'col15']] = my_df_cols

答案 1 :(得分:1)

首先,您可以编译正则表达式以避免为每行解析它们

import re

reCol1id = re.compile('^(\d+)\^')
reCol15id = re.compile('^.*\^.*\^(\d+)\^.*\^.*\^.*\^.*\^.*\^.*\^.*\^.*\^.*\^.*\^.*')

count_1 = 0
for line in open('tablefile.txt'):
    if count_1 > 70:
        break
    else:
        col1id = reCol1id.findall(line)[0]
        col15id = reCol15id.findall(line)[0]
        line = line.strip()

        count_1 += 1

        cur.execute('''INSERT INTO mytable (mycol1id, mycol15id, wholeline) VALUES (?, ?, ?)''', 
        (col1id, col15id, line, ) )

        conn.commit()
    print('row count_1=',count_1)

答案 2 :(得分:0)

我把conn.commit()放在for循环的外面。它将加载时间减少到几分钟,但我猜它不太安全。

无论如何,谢谢你的帮助。