Python 使用附加逗号将数据导入数据帧
我有这样一个数据文件:Python 使用附加逗号将数据导入数据帧,python,pandas,dataframe,Python,Pandas,Dataframe,我有这样一个数据文件: 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
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\u df=pd.read\u csv('data.csv',low\u 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 :( |
+-------+----+---------+-----------------+-----------------+
模式重复,最后一列中的逗号越多。一个可能的方法是重写文件,但我正在试图找到一种方法,只需导入它,而不必重写每个文件(我有大约65+)
我的问题是:
是否可以将(每行)第一列导入“ID”第二列导入“ORIG”第三列导入“时间”,将其他所有内容导入“文本”?这有点难看,但您可以使用动态数据:
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格式不正确,因为它不使用引号来区分作为分隔符的逗号和作为字段值一部分的逗号 但是,我们可以遍历CSV的行,并仅使用前3个逗号进行拆分: 我们可以将此迭代器直接传递给pd.DataFrame:
df = pd.DataFrame(lines, columns=header)
使用pd.read\u CSV的优化解析引擎加载有效CSV的速度不如使用pd.read\u CSV的优化解析引擎加载有效CSV的速度快,但考虑到输入的格式不正确,我认为结果非常好
屈服
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
与
虽然有几种方法可以完全强制执行此操作,但使用
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
您的数据实际上是否包含所有这些
+
和-
和=
?不,它只是用于查看目的。您可以添加实际输入的外观吗like@PadraicCunningham你指的是我的data.csv文件?通常最好给出一个人们可以复制和粘贴的实际示例。您显示的数据文件不会有问题,因为它使用|
作为分隔符。所有答案都有效,但由于您的答案在我标记为接受答案的较大文件上的输出速度更快实际上,此答案更好(至少比我的答案更好),因为它在3个逗号后停止拆分。
print(df.dtypes)
# ID int64
# ORIG int64
# TIME datetime64[ns]
# TEXT object
# dtype: object
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