[英]maximum value greater than a specific value? for each column
我有這個數據框:
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
。
如果最大值不在列O = 1.0
的行中,您可以按列S
分組並檢查每個組。
准備 dataframe
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()
Output
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']
對 dataframe 進行排序。
df1 = df.groupby('S').apply(lambda a:a.reset_index(drop=True).idxmax())
df1
Output
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
dataframe 以獲得您想要的結果。
(df1
.filter(like='X')
.ne(0)
.melt(ignore_index=False)
.astype({'value': 'int'})
)
Output
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'})
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.