Pandas:找到 pandas 数据框中最左边的值,后跟全 1

Fil*_*tio 3 python row sum pandas

我有以下数据集

data = {'ID': ['A', 'B', 'C', 'D'], 
        '2012': [0, 1, 1, 1], 
        '2013': [0, 0, 1, 1], 
        '2014': [0, 0, 0, 1], 
        '2015': [0, 0, 1, 1], 
        '2016': [0, 0, 1, 0], 
        '2017': [1, 0, 1,1]}

df  = pd.DataFrame(data)
Run Code Online (Sandbox Code Playgroud)

对于每一行,我想生成一个新列 - Baseline_Year- 它假定右侧所有值都等于 1 的列的名称。如果没有所有值都等于 1 的列,我Baseline_Year希望等于失踪。

查看预期结果

data = {'ID': ['A', 'B', 'C', 'D', 'E'], 
        '2012': [0, 1, 1, 1, 1], 
        '2013': [0, 0, 1, 1, 1], 
        '2014': [0, 0, 0, 1, 1], 
        '2015': [0, 0, 1, 1, 1], 
        '2016': [0, 0, 1, 0, 1], 
        '2017': [1, 0, 1,1, 1],
        'Baseline_Year': [np.nan, np.nan, '2015','2017', '2012'],
       }

df_results  = pd.DataFrame(data)

df_results
Run Code Online (Sandbox Code Playgroud)

moz*_*way 5

我会使用布尔掩码并且idxmax

# get year columns, identify rightmost 1s
m = (df.filter(regex=r'\d+')
       .loc[:, ::-1]
       .eq(1).cummin(axis=1)
       .loc[:, ::-1]
     )

df['Baseline_Year'] = m.idxmax(axis=1).where(m.any(axis=1))
Run Code Online (Sandbox Code Playgroud)

输出:


  ID  2012  2013  2014  2015  2016  2017 Baseline_Year
0  A     0     0     0     0     0     1          2017
1  B     1     0     0     0     0     0           NaN
2  C     1     1     0     1     1     1          2015
3  D     1     1     1     1     0     1          2017
Run Code Online (Sandbox Code Playgroud)

如果您希望右侧的 1 数量最少:

N = 2

df['Baseline_Year'] = m.idxmax(axis=1).where(m.sum(axis=1).ge(N))
Run Code Online (Sandbox Code Playgroud)

输出:


  ID  2012  2013  2014  2015  2016  2017 Baseline_Year
0  A     0     0     0     0     0     1           NaN
1  B     1     0     0     0     0     0           NaN
2  C     1     1     0     1     1     1          2015
3  D     1     1     1     1     0     1           NaN
Run Code Online (Sandbox Code Playgroud)

中间的m


    2012   2013   2014   2015   2016   2017
0  False  False  False  False  False   True
1  False  False  False  False  False  False
2  False  False  False   True   True   True
3  False  False  False  False  False   True
Run Code Online (Sandbox Code Playgroud)