Pandas read_csv() - Flie包含不同的数据

时间:2017-06-03 16:32:38

标签: python pandas dataframe

问题: 我试图在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。

2 个答案:

答案 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)]