我有以下数据集
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
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