2015-07-10 69 views
0

我有一个数据文件,例如:将数据导入到数据帧额外逗号

ID,ORIG,TIME,TEXT 
364,1,7-10-15,This works fine 
16254,1,7-10-15,But, I don't work :(
9846,0,7-10-15,Neither, do, I 

当我导入使用我试图让下面的大熊猫:

+-------+------+---------+----------------------+ 
| ID | ORIG | TIME | TEXT     | 
+=======+======+=========+======================+ 
| 3464 | 1 | 7-10-15 | This works fine  | 
+-------+------+---------+----------------------+ 
| 16254 | 1 | 7-10-15 | But, I don't work :(| 
+-------+------+---------+----------------------+ 
| 9846 | 0 | 7-10-15 | Neither, do, I  | 
+-------+------+---------+----------------------+ 

使用我的脚本data_df = pd.read_csv('data.csv', low_memory=False) ,当我导入第一行时,一切都很好(没有设置索引)。

但是,由于第二行中有一个逗号,最初在ID中的数据移动到索引列,所有内容都向左移动1。

+-------+----+---------+-----------------+-----------------+ 
|  | ID | ORIG | TIME   | TEXT   | 
+=======+====+=========+=================+=================+ 
| 3464 | 1 | 7-10-15 | This works fine | NaN    | 
+-------+----+---------+-----------------+-----------------+ 
| 16254 | 1 | 7-10-15 | But    | I don't work :(| 
+-------+----+---------+-----------------+-----------------+ 

该模式重复,在最后一列中找到更多的逗号。一个可能solution这是重写文件,但我试图找到一种方法来简单地导入它,而不必重写每个文件(我有大约65 +)。

我的问题是:

是否有可能导入(每行)第一列到“ID”第二栏为“弊”第三栏为“时间”和其他一切“TEXT”?

+0

你的数据实际上是否包含所有'+'和'-'以及'='? – DSM

+0

不,它只是用于查看目的 – Leb

+0

您可以添加实际输入看起来像 –

回答

4

您的CSV格式不正确,因为它没有使用引号来区分逗号这是从逗号分隔符这是部分一个字段的价值。

但是,我们可以通过CSV的线迭代,并使用str.split(',', 3)就只是第3个逗号分裂

lines = (line.split(',',3) for line in f) 

我们可以直接通过这个迭代pd.DataFrame

df = pd.DataFrame(lines, columns=header) 

这不会像使用pd.read_csv优化的解析引擎那样快速地加载有效的CSV,但我认为考虑到输入的结果相当不错。


import numpy as np 
import pandas as pd 

with open('data', 'r') as f: 
    header = [item.strip() for item in next(f).split(',')] 
    lines = (line.split(',', 3) for line in f) 
    df = pd.DataFrame(lines, columns=header) 
    df = df.convert_objects(convert_numeric=True) 
    df['TIME'] = pd.to_datetime(df['TIME']) 

print(df) 

产生

 ID ORIG  TIME     TEXT 
0 364  1 2015-07-10  This works fine\n 
1 16254  1 2015-07-10 But, I don't work :(\n 
2 9846  0 2015-07-10  Neither, do, I 

print(df.dtypes) 
# ID    int64 
# ORIG    int64 
# TIME datetime64[ns] 
# TEXT   object 
# dtype: object 
+0

所有答案都能正常工作,但是由于你的结果是我的大文件输出速度更快,所以我将其标记为接受的答案 – Leb

+0

实际上,这个答案*更好(至少比我的更好),因为它在3逗号。 –

2

这是一点点丑陋,但你可以使用上的即时数据使用DataFrame.from_records

crap = [l.split(',')[: 3] + [''.join(l.strip().split(',')[3: ])] \ 
    for l in open('stuff.csv').readlines()] 
>> pd.DataFrame.from_records(crap[1: ], columns=crap[0]) 
     ID ORIG  TIME     TEXT 
0 364 1 7-10-15  This works fine 
1 16254 1 7-10-15 But I don't work :(
2 9846 0 7-10-15   Neither do I 
1

虽然有一些方法来迫使这个工作完全大熊猫端,它是如此容易得多用做csv,我只是这样做:

import csv, io, pandas as pd 
data = io.StringIO() 
with open("leb.csv", newline="") as fp: 
    reader = csv.reader(fp) 
    rows = [row[:3] + [','.join(row[3:])] for row in reader] 
    writer = csv.writer(data) 
    writer.writerows(rows) 

data.seek(0) 
df = pd.read_csv(data) 

这有效地修复了大熊猫在看到它之前的输入数据。这给出了

>>> df 
     ID ORIG  TIME     TEXT 
0 364  1 7-10-15  This works fine 
1 16254  1 7-10-15 But, I don't work :(
2 9846  0 7-10-15  Neither, do, I