我有以下数据框:
df1 = pd.DataFrame({1:[1,2,3,4], 2:[1,2,4,5], 3:[8,1,5,6]})
df1
Out[7]:
1 2 3
0 1 1 8
1 2 2 1
2 3 4 5
3 4 5 6
我想创建一个新列,它将显示具有特定值的最后一列的距离,在本例中为2,来自参考列,在此示例中为3,或者返回NaN结果是没有这样的值是发现连续。输出将类似于:
df1
Out[11]:
1 2 3 dist
0 1 1 8 NaN
1 2 2 1 1
2 3 4 5 NaN
3 4 5 6 NaN
完成此任务的有效方法是什么?
答案 0 :(得分:0)
我认为需要减去3
(最后),因为列名为最后2
的参考列:
df1.columns = df1.columns.astype(int)
print((df1.columns.max() - df1.eq(2).iloc[:,::-1].idxmax(axis=1)).mask(lambda x: x == 0))
0 NaN
1 1.0
2 NaN
3 NaN
dtype: float64
<强>详情:
按2
比较:
print (df1.eq(2))
1 2 3
0 False False False
1 True True False
2 False False False
3 False False False
列的反向顺序:
print (df1.eq(2).iloc[:,::-1])
3 2 1
0 False False False
1 False True True
2 False False False
3 False False False
检查第一个True
的列名(因为反向列,它是最后一个)
print (df1.eq(2).iloc[:,::-1].idxmax(axis=1))
0 3
1 2
2 3
3 3
dtype: int64
按最大值减去,但如果参考列中的值且没有值匹配,它也会返回0
:
print (df1.columns.max() - df1.eq(2).iloc[:,::-1].idxmax(1))
0 0
1 1
2 0
3 0
dtype: int64