2017-11-15 13 views
2

Pandasのデータフレーム内のさまざまな番号の行のグループのラベル付けを容易にするツールが、Pandasまたは他のPythonパッケージにありますか?詳細は次のとおりです。Pythonデータフレームグループのラベル

私のdataFrameには、datetime.datetimeオブジェクトの列がdataFrameインデックスとして使用されています。時間は等間隔ではなく、所定の時間内に行の数が変化します。

このデータフレームでは、一定の期間(私の場合は12秒)にわたる一連の行ごとに異なるラベルを持つ列を作成する必要があります。私は、ブルートフォースループなどの代替を探しています秒

Time(s) | label 
1   | 0 
2   | 0 
3   | 0 
7   | 0 
12   | 1 
15   | 1 
20   | 1 
24   | 2 
Etc… 

との例を使用して例えば

、。それに関係するアルゴリズムはラベル付け、セグメント化、マッピングですが、正確に何を探すべきかわかりません。私は、行数が数百万オーダーになるので、より効率的な方法で、Python、Pandasおよび/またはNumpyを悪用しようとするものがあることを期待していました。

おかげ

答えて

3

デモ:

サンプルDF:

In [32]: df = pd.DataFrame({'Time':pd.date_range('2017-01-01 00:00:01', freq='3S', periods=15)}) 

In [33]: df 
Out[33]: 
        Time 
0 2017-01-01 00:00:01 
1 2017-01-01 00:00:04 
2 2017-01-01 00:00:07 
3 2017-01-01 00:00:10 
4 2017-01-01 00:00:13 
5 2017-01-01 00:00:16 
6 2017-01-01 00:00:19 
7 2017-01-01 00:00:22 
8 2017-01-01 00:00:25 
9 2017-01-01 00:00:28 
10 2017-01-01 00:00:31 
11 2017-01-01 00:00:34 
12 2017-01-01 00:00:37 
13 2017-01-01 00:00:40 
14 2017-01-01 00:00:43 

ソリューション:

In [34]: df['label'] = df.groupby(pd.Grouper(key='Time', freq='12S')).ngroup() 

結果:

In [35]: df 
Out[35]: 
        Time label 
0 2017-01-01 00:00:01  0 
1 2017-01-01 00:00:04  0 
2 2017-01-01 00:00:07  0 
3 2017-01-01 00:00:10  0 
4 2017-01-01 00:00:13  1 
5 2017-01-01 00:00:16  1 
6 2017-01-01 00:00:19  1 
7 2017-01-01 00:00:22  1 
8 2017-01-01 00:00:25  2 
9 2017-01-01 00:00:28  2 
10 2017-01-01 00:00:31  2 
11 2017-01-01 00:00:34  2 
12 2017-01-01 00:00:37  3 
13 2017-01-01 00:00:40  3 
14 2017-01-01 00:00:43  3 
+0

** freq **オプションは、12のブロックごとに一定のエントリ数を仮定していませんか?あなたの例は、与えられた頻度で生成されているので、これを受け入れますが、私の場合、12sを超えるブロックはランダムにサンプリングされるため、一定数の行にまたがっていません。その場合でもそれは効くだろうか? –

+0

@ Wall-E、はい、その場合にも動作します – MaxU

+0

実際には動作します!どうもありがとうございます! –

0

IIUC、そしてTime(s)は整数dtypeなので、必要なのはfloordivです。

df['label'] = df['Time(s)'] // 12 
関連する問題