2017-06-21 70 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