返回行中第一次出现“1”的列

时间:2016-12-07 07:15:01

标签: python python-2.7 pandas multiple-instances

我有一个数据框如下:

当列“col”发生变化时,我需要扫描第一次出现“1”的列,可乐,colb,colc,cola1,colb1,colc1。

然后,条件cola == 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 个答案:

答案 0 :(得分: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)的函数:< / p>

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

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