簡體   English   中英

最大值大於特定值? 對於每一列

[英]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.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

如果最大值不在列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

使用groupbyidxmax 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列與0ne進行比較,然后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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM