使用另一列中的数据对行进行子集

时间:2019-02-09 19:20:32

标签: python python-3.x pandas

我有一个很大的数据集,我从CSV读取到具有1s频率日期时间索引的数据帧。加载时df约为2.5gb。大多数数据存储为np.float32。在获取源数据的过程中,有时会在16hz处对它进行采样,但是CSV被索引为1秒的行,因此突发数组数据以CH [0],CH [1] ... CH [15]的形式存储沿着第二排。因此,CH0表示时间为零,CH1表示时间+ 0.0625s,以此类推。我想对这些数据进行清理,以便每个亚秒测量都有一个新行。因此,基本上该测量的所有数据都位于同一列中的16行中,而不是1行中的16列中。数据集中有数百个这样的突发通道,但是突发期间的数据简化版本(为简单起见更改为4hz)如下所示。突发采集结束后,数据返回到NaN:

我不知道从哪里开始:(

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateEducationQualificationsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {

        Schema::create('education_qualifications', function (Blueprint $table) {
            $table->increments('id');
            $table->unsignedInteger('teacher_id')->nullable();
            $table->unsignedInteger('student_id')->nullable();
            $table->string('institute_name');
            $table->string('user_degree');
            $table->string('field_of_study');
            $table->string('user_grade');
            $table->date('from_date')->nullable();
            $table->date('to_date')->nullable();
            $table->text('edu_description');
            $table->timestamps();

            $table->foreign('teacher_id')->references('id')->on('teachers')->onUpdate('cascade')->onDelete('cascade');
            $table->foreign('student_id')->references('id')->on('users')->onUpdate('cascade')->onDelete('cascade');

            $table->primary(['teacher_id', 'student_id']);

        });

    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('education_qualifications');
    }
}

我希望数据看起来像这样(显示前2秒):

                      CH0  CH1  CH2  CH3
TIME
2019-02-09 12:53:06   29   12   43   10
2019-02-09 12:53:07   56   15   77   88
2019-02-09 12:53:08   82    9   95   19
2019-02-09 12:53:09   13   13   79    1
2019-02-09 12:53:10   35   87   77   37
2019-02-09 12:53:11   53    9    5    9
2019-02-09 12:53:12   25   63   78   70
2019-02-09 12:53:13   23   62   41   22
2019-02-09 12:53:14   21   52   10   82

将数据复制到新列(例如df ['CH'])还是重用CH0都没有关系。然后,我将删除CH1等列。

编辑:

我尝试了提供的答案,但是当“ TIME”已定义为我的索引时遇到了麻烦。我在第20行df1 ['TIME'] = df ['TIME']遇到关键错误,我得到这个假设我认为TIME不再作为一列存在,所以我尝试了:

CH0 CH1 CH2 CH3 TIME 2019-02-09 12:53:06.00 29 Nan Nan Nan 2019-02-09 12:53:06.25 12 Nan Nan Nan 2019-02-09 12:53:06.50 43 Nan Nan Nan 2019-02-09 12:53:06.75 10 Nan Nan Nan 2019-02-09 12:53:07.00 56 Nan Nan Nan 2019-02-09 12:53:07.25 15 Nan Nan Nan 2019-02-09 12:53:07.50 77 Nan Nan Nan 2019-02-09 12:53:07.75 88 Nan Nan Nan 2019-02-09 12:53:08.00 82 Nan Nan Nan

那没有用。有人可以根据日期时间已经存在的索引建议对代码进行更改。我当前的完整代码(包括我如何生成概念证明数据)如下所示:

df1.index = df.index

1 个答案:

答案 0 :(得分:0)

您可以添加毫秒数并连接数据:

// Set the given text.
void QsciScintilla::setText(const QString &text)
{
    bool ro = ensureRW();

    SendScintilla(SCI_SETTEXT, ScintillaBytesConstData(textAsBytes(text)));
    SendScintilla(SCI_EMPTYUNDOBUFFER);

    setReadOnly(ro);
}

如果您的列已经是日期时间,则可以省略pd.to_datetime。 请记住要sci.SendScintilla(sci.SCI_SETTEXT, b"some text")。 在concat中,您可以使用df1 = pd.DataFrame() df1['time'] = pd.to_datetime(df['time']) df1['CH0'] = df['CH0'] df2 = pd.DataFrame() df2['time'] = pd.to_datetime(df['time'] + datetime.timedelta(milliseconds=250)) df2['CH0'] = df['CH1'] df3 = pd.DataFrame() df3['time'] = pd.to_datetime(df['time'] + datetime.timedelta(milliseconds=500)) df3['CH0'] = df['CH2'] df4 = pd.DataFrame() df4['time'] = pd.to_datetime(df['time'] + datetime.timedelta(milliseconds=750)) df4['CH0'] = df['CH3'] result = pd.concat([df1, df2, df3, df4]) result.sort('time') 。 但我认为第一次设定时间索引会更快。 如果您想让它更干,可能可以使用该代码循环甚至制作lambda。