数据帧行中最后一个匹配值的列位置(Python)

时间:2018-06-06 17:38:09

标签: python pandas dataframe

我有以下数据框:

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

完成此任务的有效方法是什么?

1 个答案:

答案 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