我有一个DataFrame,包含Name
和Date
列,单元格中的值是重量:
Name Jan17 Jun18 Dec18 Apr19 count
Nick 0 1.7 3.7 0 2
Jack 0 0 2.8 3.5 2
Fox 0 1.7 0 0 1
Rex 1.0 0 3.0 4.2 3
Snack 0 0 2.8 4.4 2
Yosee 0 0 0 4.3 1
Petty 0.5 1.3 2.8 3.5 4
根据以下要求将
Start
和Finish
添加到DataFrame中:
Start
是从Jan17
列到Apr19
列开始的,行中第一个非零值。Finish
是在序列Apr19
到Jan17
中的第一个非零值。
此外,如果行只有一个非零值,则Start
和Finish
相同。
为了找到行中第一个非零元素,我尝试使用data[col].keys, np.argmax()
,并且它按预期工作。
date_col_list = ['Jan17', 'Jun18', 'Dec18', 'Apr19']
data['Start'] = data[date_col_list].keys([np.argmax(data[date_col_list].values != 0, axis=1)])
结果为:
Name Jan17 Jun18 Dec18 Apr19 count Start
Nick 0 1.7 3.7 0 2 Jun18
Jack 0 0 2.8 3.5 2 Dec18
Fox 0 1.7 0 0 1 Jun18
Rex 1.0 0 3.0 4.2 3 Jan18
Snack 0 0 2.8 4.4 2 Dec18
Yosee 0 0 0 4.3 1 Apr19
Petty 0.5 1.3 2.8 3.5 4 Jan17
为了检测Finish
列的值,我尝试使用:
np.apply_along_axis
函数,如下所示:
def func_X(i):
return np.argmax(np.where(i!=0))
np.apply_along_axis(func1d = func_X, axis=1, arr=data[date_col_list].values)
结果出现错误:
'tuple' object has no attribute 'argmax'
期望得到的数据框如下:
Name Jan17 Jun18 Dec18 Apr19 count Start Finish
Nick 0 1.7 3.7 0 2 Jun18 Dec18
Jack 0 0 2.8 3.5 2 Dec18 Apr19
Fox 0 1.7 0 0 1 Jun18 Jun18
Rex 1.0 0 3.0 4.2 3 Jan18 Apr19
Snack 0 0 2.8 4.4 2 Dec18 Apr19
Yosee 0 0 0 4.3 1 Apr19 Apr19
Petty 0.5 1.3 2.8 3.5 4 Jan17 Apr19
我该如何找到关于非零值的Finish
,并且是从最后一列 (Apr19
) 到第一列 (Jan17
) 方向上的参考?