Pandas: 在 pandas dataframe 中找到最左边的值,然后是所有1。

3

我有以下数据集

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)

对于每一行,我想生成一个新列 - 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
1个回答

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))

输出:


  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

如果您想在右侧保留最少一个1:
N = 2

df['Baseline_Year'] = m.idxmax(axis=1).where(m.sum(axis=1).ge(N))

输出:


  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

中级 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接