最大值大于特定值?对于每一列



我有这个数据帧:

S    O        X1        X2        X3        X4
0   100  1.0  0.107455  0.446583  0.220452  0.105891
1   100  3.0  0.375586  0.314810  0.417982  0.974419
2   100  7.0  0.167457  0.555283  0.335208  0.152041
3   100  9.0  0.835885  0.213843  0.376132  0.605004
4   150  1.0  0.997843  0.837116  0.509243  0.993932
5   150  3.0  0.904277  0.276030  0.309795  0.623847
6   150  7.0  0.907843  0.387135  0.506080  0.685169
7   150  9.0   0.33937  0.990797  0.803394  0.385693
8   200  1.0  0.054206  0.105728  0.220876  0.399901
9   200  3.0  0.233063  0.972236  0.323389  0.322506
10  200  7.0   0.87344  0.395052  0.508753  0.962736
11  200  9.0  0.922502  0.471666  0.372094  0.380467
12  250  1.0  0.016137  0.478540  0.118725  0.815293
13  250  3.0  0.402824  0.466885  0.953571  0.133401
14  250  7.0  0.220363  0.134676  0.384890  0.931463
15  250  9.0   0.37158  0.429023  0.893135  0.297627

我想看看对于S中的每个值,X1, X2, X3, and X4的最大值,分别对于任何O = 3, 7, or 9都大于相同的S和相应的X列的值,但对于O = 1

例如:0.3755860.1674570.835885是否大于0.107455。对于每个S和每个X列。

预期结果:

X1  100  1
0   X1  150  0
1   X1  200  1
2   X1  250  1
3   X2  100  …
4   X2  150  …
5   X2  200  …
6   X2  250  …
7   X3  100  …
8   X3  150  …
9   X3  200  …
10  X3  250  …
11  X4  100  …
12  X4  150  …
13  X4  200  …
14  X4  250  … 

其中1表示"是",0表示"否"。

您可以按列S分组,如果最大值不在列O = 1.0的行中,则检查每个组。

准备数据框架

import pandas as pd
import io
t = """
S    O        X1        X2        X3        X4
0   100  1.0  0.107455  0.446583  0.220452  0.105891
1   100  3.0  0.375586  0.314810  0.417982  0.974419
2   100  7.0  0.167457  0.555283  0.335208  0.152041
3   100  9.0  0.835885  0.213843  0.376132  0.605004
4   150  1.0  0.997843  0.837116  0.509243  0.993932
5   150  3.0  0.904277  0.276030  0.309795  0.623847
6   150  7.0  0.907843  0.387135  0.506080  0.685169
7   150  9.0   0.33937  0.990797  0.803394  0.385693
8   200  1.0  0.054206  0.105728  0.220876  0.399901
9   200  3.0  0.233063  0.972236  0.323389  0.322506
10  200  7.0   0.87344  0.395052  0.508753  0.962736
11  200  9.0  0.922502  0.471666  0.372094  0.380467
12  250  1.0  0.016137  0.478540  0.118725  0.815293
13  250  3.0  0.402824  0.466885  0.953571  0.133401
14  250  7.0  0.220363  0.134676  0.384890  0.931463
15  250  9.0   0.37158  0.429023  0.893135  0.297627"""
df = pd.read_csv(io.StringIO(t), sep='s+')
df.head()

输出
S    O        X1        X2        X3        X4
0  100  1.0  0.107455  0.446583  0.220452  0.105891
1  100  3.0  0.375586  0.314810  0.417982  0.974419
2  100  7.0  0.167457  0.555283  0.335208  0.152041
3  100  9.0  0.835885  0.213843  0.376132  0.605004
4  150  1.0  0.997843  0.837116  0.509243  0.993932

使用groupbyidxmaxX列包含每个最大值组的索引。要做到这一点,数据框必须按['S','O']排序。

df1 = df.groupby('S').apply(lambda a:a.reset_index(drop=True).idxmax())
df1

输出
S  O  X1  X2  X3  X4
S                        
100  0  3   3   2   1   1
150  0  3   0   3   3   0
200  0  3   3   1   2   2
250  0  3   1   0   1   2

X列与0nemelt列的数据框进行比较,得到您想要的结果。

(df1
.filter(like='X')
.ne(0)
.melt(ignore_index=False)
.astype({'value': 'int'})
)

输出
variable  value
S                  
100       X1      1
150       X1      0
200       X1      1
250       X1      1
100       X2      1
150       X2      1
200       X2      1
250       X2      0
100       X3      1
150       X3      1
200       X3      1
250       X3      1
100       X4      1
150       X4      0
200       X4      1
250       X4      1

pandas <1.1.0的备选方案

(df1
.filter(like='X')
.ne(0)
.stack()
.to_frame()
.sort_index(level=[1,0])
.reset_index()
.astype({0: 'int'})
)

最新更新