2017-06-21 7 views
1

インデックス(最初またはゼロの列df2 [0])を見てdf2データフレームから開始値と終了値(つまり行)を持つタプルのリストを探しようとしています。 df2例:パンダ:連続して番号を付けるとインデックスでグループを見つける

COL0 COL1 COL2 
    4 x y # start 'tuple x' of COL1 
    5 i j 
    6 n m # end 'tuple n' 
14 f a # start 'tuple f' 
15 e b # end 'tuple e' 
... 

したがって、COL0の連続する値がグループを形成します。次の行が連続していない場合(例えば6-14)、新しいグループが開始される。

Crit_a = df2[0][0] + 1 == df2[0][1] 

が出力として、私は行ごとに、次の新しいDF3を探しています:私はSO hereや他の場所を見ていた

COL0 COL1 COL2 COL3 COL4 ... 
    4 x y n m # start values and end values of COL1 and COL2 
14 f a e b 

選択は、以下の可能性があります。 ありがとうございます。

+0

希望する出力は何ですか? – Allen

+0

@Allen:希望の出力を追加しました – user1739581

答えて

1

正確な出力はありませんが、直感的です。

COL0の連続する値にラベルを付けるために、group_noという名前の列を作成します。私は、この違いが1つではない列の差分値を見つけ出し、その結果に塊をつけました。最初の要素はあいまいです(差分をとるとNaNですので、その値に1を加えた値に2番目の値が等しいかどうかをチェックします)。そうであれば、最初の値は連続し、1の値が割り当てられます。 0

df = df.assign(group_no = (df.COL0.diff() != 1).cumsum()) 
df.group_no.iat[0] = 1 if df.COL0.iat[0] + 1 == df.COL0.iat[1] else 0 
df_new = df.groupby('group_no').agg(
    {'COL0': ['first'], 
    'COL1': ['first', 'last'], 
    'COL2': ['first', 'last']}) 
>>> df_new 
      COL2  COL0 COL1  
     first last first first last 
group_no        
1   y m  4  x n 
2   a b 14  f e 

agg関数の値は、辞書をとり、その列の結果の順序は任意でよい結果の列を注文するには、明示的にそれを行うことができ、例えば:。

df_new[[('COL0', 'first'), 
     ('COL1', 'first'), 
     ('COL1', 'last'), 
     ('COL2', 'first'), 
     ('COL2', 'last')]] 

これはまた動作します:

n = 3 # First three columns of original dataframe. 
df_new.loc[:, pd.IndexSlice[df.columns[:n], :]] 
+0

ありがとうございます。現在注文されていないので、df_newの列を注文する最良の方法は何でしょうか? – user1739581

+0

注文の更新ありがとうございます:しかし、agg関数に続いてdf_new [[( 'COL0'、 'first')、( 'COL1'、 'first')など]]を適用すると、列の順序は変わりません。 – user1739581

+0

「適用する」と正確には何を意味しますか?選択した順序で列を明示的に選択しています。 – Alexander

1

最初に、同じグループに属する行のグループキーを作成します。

df['COL0'] = \ 
    (df.COL0.rolling(2,min_periods=1) 
     .apply(lambda x: x[-1] if int(x[-1]-x[0])!=1 else np.nan) 
     .ffill() 
    ) 

キーでグループ化し、開始行と終了行を見つけて列として展開します。最後に列の名前を変更します。

df2 = \ 
    (df[['COL1','COL2']].groupby(df.COL0) 
     .apply(lambda x: np.array([x.iloc[0],x.iloc[-1]]).flatten()) 
     .apply(pd.Series) 
     .rename_axis(lambda x: 'COL'+str(x+1),axis=1) 
    ) 


df2 
Out[178]: 
    COL1 COL2 COL3 COL4 
COL0      
4.0  x y n m 
14.0 f a e b 
関連する問題