【问题标题】:data preparation of a large data set in pandaspandas 大数据集的数据准备
【发布时间】:2017-11-24 23:39:21
【问题描述】:

我想对我的数据进行简单的时间序列可视化,如下所示:

1;2;0;"0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;";"0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0";"11";13.10.2016 10:13:42 2;1;0;"0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;";"0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0";"1";13.10.2016 10:13:42

据我所知,传感器的数据存储在这两个全为 0 的字符串中(并非所有行都只包含 0)。我将如何继续为每个传感器的日期创建一个包含一列的数据框?或者是什么让我可以随时间绘制传感器数据(例如 25 个和 20 个传感器)。

我尝试的是以下内容:

data = pd.read_csv('data.csv', delimiter=';') df = pd.concat([data[[0:3]], data[3].str.split(';', expand=True),data[4].str.split(';', expand=True), data[[-2,-1]]], axis=1)

但是花了这么长时间,我没有等待处理 900,000 行的结果......

【问题讨论】:

    标签: python pandas dataframe time-series


    【解决方案1】:

    我觉得你可以使用参数quoting:

    import pandas as pd
    import csv
    from pandas.compat import StringIO
    
    temp=u'''
    1;2;0;"0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;";"0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0";"11";13.10.2016 10:13:42
    2;1;0;"0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;";"0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0";"1";13.10.2016 10:13:42
    '''
    #after testing replace 'StringIO(temp)' to 'filename.csv'
    df = pd.read_csv(StringIO(temp), sep=";", quoting=csv.QUOTE_NONE, header=None)
    
    #temporary diplay 52 columns
    with pd.option_context('display.max_columns', 52):
        print (df)
       0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  \
    0   1   2   0  "0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   
    1   2   1   0  "0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   
    
       19  20  21  22  23  24  25  26  27 28  29  30  31  32  33  34  35  36  37  \
    0   0   0   0   0   0   0   0   0   0  "  "0   0   0   0   0   0   0   0   0   
    1   0   0   0   0   0   0   0   0   0  "  "0   0   0   0   0   0   0   0   0   
    
       38  39  40  41  42  43  44  45  46  47  48    49                   50  
    0   0   0   0   0   0   0   0   0   0   0  0"  "11"  13.10.2016 10:13:42  
    1   0   0   0   0   0   0   0   0   0   0  0"   "1"  13.10.2016 10:13:42 
    

    然后是applystrip

    #data cleaning
    cols = [3, 29, 48, 49]
    df[cols] = df[cols].apply(lambda x: x.str.strip('"').astype(int))
    #remove empty column
    df = df.drop(28, axis=1)
    #reset columns names
    df.columns = pd.RangeIndex(len(df.columns))
    with pd.option_context('display.max_columns', 52):
        print (df)
       0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  \
    0   1   2   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   
    1   2   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   
    
       19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  \
    0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   
    1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   
    
       38  39  40  41  42  43  44  45  46  47  48                   49  
    0   0   0   0   0   0   0   0   0   0   0  11  13.10.2016 10:13:42  
    1   0   0   0   0   0   0   0   0   0   0   1  13.10.2016 10:13:42
    

    【讨论】:

    • 完整的文件我收到了这个错误消息,但这应该是关于数据的质量然后我猜:CParserError:错误标记数据。 C 错误:预计第 33595 行中有 50 个字段,看到 51
    • 嗯,这行可以省略吗?
    • 解决方法是添加error_bad_lines=False,检查docs
    • 我想诀窍是引用参数,不是吗?非常感谢您的快速回复!
    • 没错。谢谢。
    猜你喜欢
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多