使用附加逗号将数据导入数据帧

2024-03-29 06:43:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个数据文件:

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  

当我使用pandas导入时,我尝试获得以下内容:

+-------+------+---------+----------------------+
| 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”第二列导入“ORIG”第三列导入“TIME”,其他所有内容导入“TEXT”?你知道吗


Tags: csvtextiddatatimethisdobut
3条回答

这有点难看,但是您可以使用^{}使用动态数据:

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

虽然有几种方法可以让它完全工作,但使用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

您的CSV格式不正确,因为它不使用引号来区分逗号(逗号是分隔符)和逗号(逗号是字段值的一部分)。你知道吗

但是,我们可以遍历CSV的行并使用^{}在前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

相关问题 更多 >