2016-12-07 58 views
-1

我有如下一个数据帧返回列:为“1”的行中第一次出现

当在列“关口”,我需要扫描的列,可乐,COLB,COLC,cola1变化,第一次出现“1”的colb1,colc1。

然后,条件可乐== cola1 == 1或COLB == colb1 == 1或COLC == colc1 == 1应满足,并在新列返回列名 “New_col”

输入:

 cola colb colc cola1 colb1 colc1 col 
     0  0 0  0  0  0  18 
     1  0 0  1  1  0  18 
     1  0 0  1  1  0  18 
     1  0 0  1  1  0  18 
     1  0 0  1  1  0  18 
     0  0 0  0  0  0  24 
     0  1 0  0  1  0  24 
     0  1 0  0  1  0  24 
     0  1 0  0  1  0  24 
     0  1 0  0  1  0  24 
     0  0 0  0  1  0  10 

预期输出:

 cola colb colc cola1 colb1 colc1 col New_col 
    0  0 0  0  0  0  18  
    1  0 0  1  1  0  18 
    1  0 0  1  1  0  18 
    1  0 0  1  1  0  18 
    1  0 0  1  1  0  18 
    0  0 0  0  0  0  24  cola 
    0  1 0  0  1  0  24 
    0  1 0  0  1  0  24 
    0  1 0  0  1  0  24 
    0  1 0  0  1  0  24 
    0  0 0  0  1  0  10 colb 
+1

如果所有3条件都满足会怎么样。你想要什么输出?有没有优先权? –

+0

我不明白为什么输出在其行中。因为它似乎是以前组的第一次出现。你能解释更多吗? – jezrael

+0

在第5行中,“col”列的值从0变为1.因此,我需要扫描该行上方的所有其他列,以获得第一次出现的“1”。 并且要返回的输出应该满足: 只有当可乐和cola1 = 1或colb和colb1 = 1或colc和colc1 = 1时。 – Anagha

回答

1

一个几乎完整的答案:

首先,计算出你正在使用的条件,并把它们列:

df['conda'] = (df['cola'] == 1) & (df['cola1'] == 1) 
df['condb'] = (df['colb'] == 1) & (df['colb1'] == 1) 
df['condc'] = (df['colc'] == 1) & (df['colc1'] == 1) 

df['anycond'] = df['conda'] | df['condb'] | df['condc'] 

,定义一个函数,它的第一个真正的条件(的abc)只要任何条件是真的:

def get_first_condition(g): 
    if not g['anycond'].any(): 
     return np.nan 
    mask = g.loc[g['anycond'], ['conda', 'condb', 'condc']].iloc[0].values 
    return np.array(['cola', 'colb', 'cocl'])[mask][0] 

,适用于col分组数据框:

df.groupby('col').apply(get_first_condition) 

col 
10  NaN 
18 cola 
24 colb 

第四个,只需使用此结果来填充新列。你需要做一些转变。