2017-05-15 7 views
2

pandas.DataFrameには整数の列名があり、ゼロと1を持ちます。入力の例:連続的なものの配列(開始起こるデータフレーム内で連続したものをカウントし、インデックスが得られる場所

12 13 14 15 
1 0 0 1 0 
2 0 0 1 1 
3 1 0 0 1 
4 1 1 0 1 
5 1 1 1 0 
6 0 0 1 0 
7 0 0 1 1 
8 1 1 0 1 
9 0 0 1 1 
10 0 0 1 1 
11 1 1 0 1 
12 1 1 1 1 
13 1 1 1 1 
14 1 0 1 1 
15 0 0 1 1 

Iは> = 2であり、長さ/和を有するすべての連続したものをカウントする必要があり、列を反復し、また戻すこと指数、終わり)。

好ましい出力は3Dデータフレームで、サブカラム「count」と「indices」は入力の整数列名を参照します。

の出力例は、この1のようになります。私はそれがitertools.groupbyで解決しなければならないが、それでもこのような問題は、両方のgroupby結果とに適用する方法を見つけ出すことができないと仮定し

12    13    14    15 
count indices count indices count indices count indices 
    3  (3,5)  2  (4,5)  2  (1,2)  3  (2,4) 
    4 (11,14)  3 (11,13)  3  (5,7)  9 (7,15) 
            2 (9,10) 
            4 (12,15)  

そのインデックスが抽出されています。ここ

+0

関連性はありますが、同一ではありません:http://stackoverflow.com/q/43943369/2988730 –

答えて

1

は、所望のランレングスを計算する一つの方法である:

コード:

def min_run_length(series): 
    terminal = pd.Series([0]) 
    diffs = pd.concat([terminal, series, terminal]).diff() 
    starts = np.where(diffs == 1) 
    ends = np.where(diffs == -1) 
    return [(e-s, (s, e-1)) for s, e in zip(starts[0], ends[0]) 
      if e - s >= 2] 

テストコード:

df = pd.read_fwf(StringIO(u""" 
    12 13 14 15 
    0 0 1 0 
    0 0 1 1 
    1 0 0 1 
    1 1 0 1 
    1 1 1 0 
    0 0 1 0 
    0 0 1 1 
    1 1 0 1 
    0 0 1 1 
    0 0 1 1 
    1 1 0 1 
    1 1 1 1 
    1 1 1 1 
    1 0 1 1 
    0 0 1 1"""), header=1) 
print(df.dtypes) 

indices = {cname: min_run_length(df[cname]) for cname in df.columns} 
print(indices) 

結果:

{ 
u'12': [(3, (3, 5)), (4, (11, 14))], 
u'13': [(2, (4, 5)), (3, (11, 13))], 
u'14': [(2, (1, 2)), (3, (5, 7)), (2, (9, 10)), (4, (12, 15))] 
u'15': [(3, (2, 4)), (9, (7, 15))], 
} 
+0

これは非常にスマートな解決策です!どうもありがとう! – Tigls

関連する問題