2015-07-10 61 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