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)
我会使用布尔掩码并且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)
| 归档时间: |
|
| 查看次数: |
56 次 |
| 最近记录: |