我有这个数据帧:
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.375586
、0.167457
、0.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
使用groupby
和idxmax
。X
列包含每个最大值组的索引。要做到这一点,数据框必须按['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
列与0
、ne
和melt
列的数据框进行比较,得到您想要的结果。
(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'})
)