我有一个数据框如下:
当列“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
答案 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']
第二,定义一个在任何条件为真时立即采用第一个真实条件(a
,b
,c
)的函数:< / 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
第四,只需使用此结果填充新列。你需要做一些转移。