2016-04-12 10 views
1

タイムスタンプインデックスの測定値を含むパケットで構成されるDataFrameがあります。測定セクションの開始および終了を示すフラグパケットがメッセージ内に散在している。この例は、以下:ユニークでないタイムスタンプのPandas DataFrameスライスデータ

      dev node meas 0 meas 1 ... 
tstp 
2016-04-12 03:42:16.238 instr None [val] [val] 
2016-04-12 03:42:16.338 cntrl 101 [val] [val] 
2016-04-12 03:42:16.442 instr None [val] [val] 
2016-04-12 03:42:16.445 instr None [val] [val] 
2016-04-12 03:42:16.445 cntrl 101 [val] [val] 
2016-04-12 03:42:16.448 instr None [val] [val] 
2016-04-12 03:42:16.540 instr None [val] [val] 
2016-04-12 03:42:16.600 cntrl 101 [val] [val] 
2016-04-12 03:42:16.639 instr None [val] [val] 
2016-04-12 03:42:16.741 instr None [val] [val] 
2016-04-12 03:42:17.238 instr None [val] [val] 
2016-04-12 03:42:17.338 cntrl 102 [val] [val] 
2016-04-12 03:42:17.442 instr None [val] [val] 
2016-04-12 03:42:17.445 instr None [val] [val] 
2016-04-12 03:42:17.445 cntrl 102 [val] [val] 
2016-04-12 03:42:17.448 instr None [val] [val] 
2016-04-12 03:42:17.540 instr None [val] [val] 
2016-04-12 03:42:17.600 cntrl 102 [val] [val] 
2016-04-12 03:42:17.639 instr None [val] [val] 
2016-04-12 03:42:17.741 instr None [val] [val] 

私は何をしようとしていることである:BEGの

for name, group in pkts.groupby('node') : 
    beg = group.index[0] 
    end = group.index[-1] 

    # pseudocode 
    pkts[ beg:end & pkts.dev=='instr' , 'node' ] = name 

直接スライシング:エンドは非一意の値以降は動作しません。誰かがこれを行うにはいくつかの洞察力や良い方法を提供できますか?

UPDATE(明確化):

目的:簡単にノード番号に基づいて、 "INSTR" デバイスからの測定値にアクセスします。 "instr"デバイスがノード値を送信できません。

所望の出力(元々の提案に開いて、目的とする):その後、私はあなたがreset_indexset_indexによってindexからMultiindexを作成することができると思い

      dev node meas 0 meas 1 ... 
tstp 
2016-04-12 03:42:16.238 instr None [val] [val] 
2016-04-12 03:42:16.338 cntrl 101 [val] [val] 
2016-04-12 03:42:16.442 instr 101 [val] [val] 
2016-04-12 03:42:16.445 instr 101 [val] [val] 
2016-04-12 03:42:16.445 cntrl 101 [val] [val] 
2016-04-12 03:42:16.448 instr 101 [val] [val] 
2016-04-12 03:42:16.540 instr 101 [val] [val] 
2016-04-12 03:42:16.600 cntrl 101 [val] [val] 
2016-04-12 03:42:16.639 instr None [val] [val] 
2016-04-12 03:42:16.741 instr None [val] [val] 
2016-04-12 03:42:17.238 instr None [val] [val] 
2016-04-12 03:42:17.338 cntrl 102 [val] [val] 
2016-04-12 03:42:17.442 instr 102 [val] [val] 
2016-04-12 03:42:17.445 instr 102 [val] [val] 
2016-04-12 03:42:17.445 cntrl 102 [val] [val] 
2016-04-12 03:42:17.448 instr 102 [val] [val] 
2016-04-12 03:42:17.540 instr 102 [val] [val] 
2016-04-12 03:42:17.600 cntrl 102 [val] [val] 
2016-04-12 03:42:17.639 instr None [val] [val] 
2016-04-12 03:42:17.741 instr None [val] [val] 
+0

簡単な '.fillna('ffill ')で問題を解決できますか?達成しようとしていることを抽象的に表現できますか? –

+0

私はデータを整列しようとしています。したがって、測定装置からノード '101'で測定値を選択する場合は、ラベルが付けられます。これらの測定値は、制御装置の最初と最後の101の間になります。 –

答えて

1

、方法ffillbfillNaNからreplaceNoneと使用fillna

pkts = pkts.reset_index().set_index('tstp', append=True) 
print pkts 
           dev node meas 0 meas 1 
    tstp            
0 2016-04-12 03:42:16.238 instr None [val] [val] 
1 2016-04-12 03:42:16.338 cntrl 101 [val] [val] 
2 2016-04-12 03:42:16.442 instr None [val] [val] 
3 2016-04-12 03:42:16.445 instr None [val] [val] 
4 2016-04-12 03:42:16.445 cntrl 101 [val] [val] 
5 2016-04-12 03:42:16.448 instr None [val] [val] 
6 2016-04-12 03:42:16.540 instr None [val] [val] 
7 2016-04-12 03:42:16.600 cntrl 101 [val] [val] 
8 2016-04-12 03:42:16.639 instr None [val] [val] 
9 2016-04-12 03:42:16.741 instr None [val] [val] 
10 2016-04-12 03:42:16.238 instr None [val] [val] 
11 2016-04-12 03:42:16.338 cntrl 102 [val] [val] 
12 2016-04-12 03:42:16.442 instr None [val] [val] 
13 2016-04-12 03:42:16.445 instr None [val] [val] 
14 2016-04-12 03:42:16.445 cntrl 102 [val] [val] 
15 2016-04-12 03:42:16.448 instr None [val] [val] 
16 2016-04-12 03:42:16.540 instr None [val] [val] 
17 2016-04-12 03:42:16.600 cntrl 102 [val] [val] 
18 2016-04-12 03:42:16.639 instr None [val] [val] 
19 2016-04-12 03:42:16.741 instr None [val] [val] 

pkts['node'] = pkts['node'].replace('None',np.nan) 

for name, group in pkts.groupby('node'): 
    beg = group.index[0] 
    end = group.index[-1] 
# print beg 
# print end 
    pkts.loc[ beg:end,'node' ] = pkts.loc[ beg:end,'node' ].fillna(method='ffill') 
                  .fillna(method='bfill') 
print pkts 
           dev node meas 0 meas 1 
    tstp            
0 2016-04-12 03:42:16.238 instr NaN [val] [val] 
1 2016-04-12 03:42:16.338 cntrl 101 [val] [val] 
2 2016-04-12 03:42:16.442 instr 101 [val] [val] 
3 2016-04-12 03:42:16.445 instr 101 [val] [val] 
4 2016-04-12 03:42:16.445 cntrl 101 [val] [val] 
5 2016-04-12 03:42:16.448 instr 101 [val] [val] 
6 2016-04-12 03:42:16.540 instr 101 [val] [val] 
7 2016-04-12 03:42:16.600 cntrl 101 [val] [val] 
8 2016-04-12 03:42:16.639 instr NaN [val] [val] 
9 2016-04-12 03:42:16.741 instr NaN [val] [val] 
10 2016-04-12 03:42:16.238 instr NaN [val] [val] 
11 2016-04-12 03:42:16.338 cntrl 102 [val] [val] 
12 2016-04-12 03:42:16.442 instr 102 [val] [val] 
13 2016-04-12 03:42:16.445 instr 102 [val] [val] 
14 2016-04-12 03:42:16.445 cntrl 102 [val] [val] 
15 2016-04-12 03:42:16.448 instr 102 [val] [val] 
16 2016-04-12 03:42:16.540 instr 102 [val] [val] 
17 2016-04-12 03:42:16.600 cntrl 102 [val] [val] 
18 2016-04-12 03:42:16.639 instr NaN [val] [val] 
19 2016-04-12 03:42:16.741 instr NaN [val] [val] 
+0

'name'で塗りつぶしたくありません.101,102などのイテラブルの値を塗りたいと思っています。 –

+0

Sory、それぞれgroupbyのNoneは '101,101,101、...'と ' 102,102,102、... 'または' 101,102,103、... '、' 104,105,106、... ' – jezrael

+0

どうすればpkts1の値をpktsに置き換えることができますか?参加権のようなもの? –

関連する問題