问题描述
我正在尝试从4个以相同名称开头的多列中创建一个新列。这些列中的3或4是NaN。我想让新列具有此非NaN值(如果它存在于特定行中)。否则,新列应为NaN。
开始于:
NaN = np.NaN
pd.DataFrame( {'process_time_1': [5,NaN,NaN],'process_time_2': [NaN,'process_time_3': [NaN,3,4],'process_time_4': [NaN,NaN]} )
如果希望新列显示为:
NaN = np.NaN
pd.DataFrame( {'process_time': [5,4]} )
我当前拥有的代码:
cols = [df1.columns.str.startswith('process')]
df1[cols][df1.notna()]
我正在打破这个观念,如果有人可以帮助您朝正确的方向发展,那将是非常棒的:) 预先感谢!
解决方法
您可以在此处使用ffill
转发有效值,并保留最后一列:
df['process_time'] = df.filter(like='process').ffill(axis=1).iloc[:,-1]
print(df)
process_time_1 process_time_2 process_time_3 process_time_4 \
0 5.0 NaN NaN NaN
1 NaN NaN NaN NaN
2 NaN NaN 3.0 NaN
3 NaN NaN 4.0 NaN
process_time
0 5.0
1 NaN
2 3.0
3 4.0
,
您可以将SELECT *
与DISTINCT
一起使用:
max
axis=1