在Pandas的一组列中,找到最大值和第二大值之间的差异。

6
我有一个相当大的数据框:
A B C D
0 17 36 45 54
1 18 23 17 17
2 74 47 8 46
3 48 38 96 83
我想创建一个新列,该列为(列中的最大值) - (第二高值) / (第二高值)。
在这个例子中,它看起来像:
A B C D Diff
0 17 36 45 54 .20
1 18 23 17 17 .28
2 74 47 8 46 .57
3 48 38 96 83 .16
我试图创建一个新列,该列为(列中的最大值) - (第二高值) / (第二高值)。
例如df['diff'] = df.loc[:, 'A': 'D'].max(axis=1) - df.iloc[:df.index.get_loc(df.loc[:, 'A': 'D'].idxmax(axis=1))] / ...
但就连公式的这部分也会出错,更不用说包括最后的除法了。我相信肯定有更简便的方法来解决这个问题。
编辑:另外,我还想获得最大值与紧随其前的列之间的差异。我知道这是一个有些不同的问题,但我会感激任何见解。谢谢!
4个回答

4

使用 pandas.Series.nlargest 以及 pct_change 的一种方法:

df["Diff"] = df.apply(lambda x: x.nlargest(2).pct_change(-1)[0], axis=1)

输出:

    A   B   C   D      Diff
0  17  36  45  54  0.200000
1  18  23  17  17  0.277778
2  74  47   8  46  0.574468
3  48  38  96  83  0.156627

3

一种方法是应用UDF:

def get_pct(x):
    xmax2, xmax = x.sort_values().tail(2)
    return (xmax-xmax2)/xmax2

df['Diff'] = df.apply(get_pct, axis=1)

输出:

    A   B   C   D      Diff
0  17  36  45  54  0.200000
1  18  23  17  17  0.277778
2  74  47   8  46  0.574468
3  48  38  96  83  0.156627

谢谢!我在原帖中没有包含这个问题。但是是否可能获得最高值所在列与其前一列(无论其值如何)之间的差异:(ColumnMax.value - columnmax.column - 1.value)? - Rick Batra

2
我们还可以利用NumPy的sort和np.diff方法:
arr = np.sort(df,axis=1)[:,-2:]
df['Diff'] = np.diff(arr,axis=1)[:,0]/arr[:,0]

print(df)

    A   B   C   D      Diff
0  17  36  45  54  0.200000
1  18  23  17  17  0.277778
2  74  47   8  46  0.574468
3  48  38  96  83  0.156627

1

让我们尝试使用 mask 获取第二个最大值。

Max = df.max(1)
secMax = df.mask(df.eq(Max,0)).max(1)
df['Diff'] = (Max - secMax)/secMax
df
Out[69]: 
    A   B   C   D      Diff
0  17  36  45  54  0.200000
1  18  23  17  17  0.277778
2  74  47   8  46  0.574468
3  48  38  96  83  0.156627

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接