2017-06-21 71 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每行有以下幾點:

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

我看着SO here和其他地點。 謝謝你的建議。

+0

你想要的輸出是什麼? – Allen

+0

@Allen:我添加了所需的輸出 – user1739581

回答

1

不完全是您想要的輸出,但也許更直觀?

我創建了一個名爲group_no的列來標記來自COL0的連續值。我將這些列進行了區分,找出這些差異不是一個的值,然後對結果做了一個cumsum。第一個元素是不明確的(當它是差值時,它是NaN,所以我檢查它的值是否等於第二個值,如果是,則第一個值是連續的,並賦值爲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