问题: 我试图在csv中读取包含不同列大小的数据的pandas数据帧。
示例&说明:
Code:
df = pd.read_csv(input, error_bad_lines=False)
input:
ID, Time, Val
15, 18:00:01, 4
15, 18:00:02, 6
15, 18:00:03, 5
ID, Time, Val1, Val2
16 18:00:03, 1, 43
ID, Time, Val
15, 18:00:04, 8
并且此模式将继续整个文件。最初我考虑丢掉额外的列,因为read_csv选项抛出错误并且没有读取它们我刚开始忽略它们。然而,我在我的数据框中得到了重复的标题...为了解决这个问题,我尝试了drop_duplicates()
,但发现仅在V0.17的pandas中它们包含keep=False
选项。我最终开始说服自己尝试保留数据。所以这是我的问题。基于上面的数据集,我希望我能够创建两个独特的数据帧。您可以假设ID始终是唯一的,因此您可以为您拥有的不同ID的数量创建N个帧。每个ID都不会有相同数量的标头。一旦遇到不同的ID,将打印其标题。因此,例如,如果我们点击另一个ID 16,其标题将在数据之前打印。再次,如果我们点击另一个ID 15,它的标题将在其数据之前打印。
我想在开始使用数据帧之前可能只是预处理数据,因为这是一个选项。但是,由于我对大熊猫所能做的事情仍然相当新,我希望也许有些人在我开始之前会有一些建议,并写下一些讨厌的预处理代码:)。另一个我认为变成问题的想法是 - 对于error_bad_lines,有没有办法将这些行保存到另一个数据帧或其他东西?另外,我告诉read_csv中的pandas只查找ID为X的项目,并为我的所有ID执行此操作?我将补充说,ID的数量是有限的并且是已知的。
我当前的熊猫版本是0.14。
答案 0 :(得分:1)
注意我更正了我认为样本数据中的拼写错误。
ID
的换行符。from io import StringIO
import pandas as pd
import re
txt = """ID, Time, Val
15, 18:00:01, 4
15, 18:00:02, 6
15, 18:00:03, 5
ID, Time, Val1, Val2
16, 18:00:03, 1, 43
ID, Time, Val
15, 18:00:04, 8"""
def parse(s):
return pd.read_csv(StringIO(s), skipinitialspace=True)
pd.concat([parse(s) for s in re.split('\n(?=ID)', txt)])
ID Time Val Val1 Val2
0 15 18:00:01 4.0 NaN NaN
1 15 18:00:02 6.0 NaN NaN
2 15 18:00:03 5.0 NaN NaN
0 16 18:00:03 NaN 1.0 43.0
0 15 18:00:04 8.0 NaN NaN
以上是使用OP提供的样本数据。如果这是在csv文件中,解决方案将如下所示
from io import StringIO
import pandas as pd
import re
with open('myfile.csv') as f:
txt = f.read()
def parse(s):
return pd.read_csv(StringIO(s), skipinitialspace=True)
pd.concat([parse(s) for s in re.split('\n(?=ID)', txt)])
答案 1 :(得分:0)
您可以将文件视为包含四列:
df = pd.read_csv(input, names=['id', 'time', 'v1', 'v2'])
并过滤掉额外的标题:
df = df[df.id != 'ID']
然后,您的两个数据集只是df[pd.isnull(df.v2)]
和df[~pd.isnull(df.v2)]
。