簡體   English   中英

pandas DataFrame:列中同號值相加的最大值和最小值

[英]pandas DataFrame: Maximum and minimum values of the addition of the values of the same sign in the column

我有一個 pandas DataFrame。 DataFrame 的值是三種計算模型(RSA1、RSA 2、RSA 3)的結果。 每個 model 的組和案例都相同。 Fx、Fy、Fz 列的值可以是正浮點數或負浮點數。

    Model   Group   Case    Fx      Fy      Fz
0   RSA 1   G       100     120.0   0.0     140.0
1   RSA 1   G       101     40.0    140.0   50.0
2   RSA 1   Q       200     10.0    -50.0   30.0
3   RSA 1   Q       201     -50.0   -20.0   -60.0
4   RSA 1   WX      500     -80.0   -20.0   -40.0
5   RSA 1   WX      501     -10.0   -80.0   70.0
6   RSA 1   WY      600     90.0    -40.0   -10.0
7   RSA 1   WY      601     -80.0   80.0    -20.0
32  RSA 2   G       100     40.0    60.0    140.0
33  RSA 2   G       101     120.0   130.0   140.0
34  RSA 2   Q       200     -90.0   -70.0   -80.0
35  RSA 2   Q       201     50.0    0.0     -100.0
36  RSA 2   WX      500    -70.0    20.0    -20.0
37  RSA 2   WX      501     -50.0   60.0    40.0
38  RSA 2   WY      600    -80.0    90.0    -100.0
39  RSA 2   WY      601     30.0    -60.0   40.0
64  RSA 3   G       100     130.0   50.0    110.0
65  RSA 3   G       101     60.0    20.0    120.0
66  RSA 3   Q       200     0.0    -70.0    40.0
67  RSA 3   Q       201     -10.0   -30.0   -70.0
68  RSA 3   WX      500    -30.0    70.0    -40.0
69  RSA 3   WX      501     60.0    80.0    40.0
70  RSA 3   WY      600    -20.0    80.0    -100.0
71  RSA 3   WY      601     0.0     90.0    -30.0

我正在尋找:

  1. 同一組中所有案例值相加的所有模型中的最大值和最小值。 例如:

Model:RSA 1; 組:G; Fx -> 120.0 + 40.0 = 160.0

Model:RSA 2; 組:G; Fx -> 40.0 + 120.0 = 160.0

Model:RSA 3; 組:G; Fx -> 130.0 + 60.0 = 190.0

最大值:190.0

最小值:160.0

  1. 每種情況下所有模型的最大值和最小值。 例如:

Model:RSA 1; 組:G; 案例600; 外匯 -> 90.0

Model:RSA 1; 組:G; 案件601; 外匯 -> -80.0

Model:RSA 2; 組:G; 案例600; 外匯 -> -80.0

Model:RSA 2; 組:G; 案件601; 外匯 -> 30.0

Model:RSA 3; 組:G; 案例600; 外匯 -> -20.0

Model:RSA 3; 組:G; 案件601; 外匯 -> 0.0

最大值:90.0

最小值:-80.0

  1. 同一組的所有案例的相同符號值相加的所有模型中的最大值和最小值。 例如:

Model:RSA 1; 組:Q; 案例200; Fz -> 30.0

Model:RSA 1; 組:Q; 案例201; Fz -> -60.0

Model:RSA 1; 組:Q; 添加正值:30.0

Model:RSA 1; 組:Q; 添加負值:-60.0

Model:RSA 2; 組:Q; 案例200; Fz -> -80.0

Model:RSA 2; 組:Q; 案例201; Fz -> -100.0

Model:RSA 2; 組:Q; 添加正值:0.0

Model:RSA 2; 組:Q; 添加負值:-180.0

Model:RSA 3; 組:Q; 案例200; Fz -> 40.0

Model:RSA 3; 組:Q; 案例201; Fz -> -70.0

Model:RSA 3; 組:Q; 添加正值:40.0

Model:RSA 3; 組:Q; 添加負值:-70.0

最大值:40.0

最小值:-180.0

這是第一種情況的代碼:

df_1 = df.groupby(['Model', 'Group']).sum()
df_1.groupby('Group').agg(['max', 'min'])

        Fx              Fy              Fz
        max     min     max     min     max     min
Group                       
G       190.0   160.0   190.0   70.0    280.0   190.0
Q       -10.0   -40.0   -70.0   -100.0  -30.0   -180.0
WX      30.0    -120.0  150.0   -100.0  30.0    0.0
WY      10.0    -50.0   170.0   30.0    -30.0   -130.0

這是第二種情況的代碼:

df_2 = df.groupby(['Model', 'Group', 'Case']).sum()
df_2.groupby('Group').agg(['max', 'min'])

        Fx              Fy              Fz
        max     min     max     min     max     min
Group                       
G       130.0   40.0    140.0   0.0     140.0   50.0
Q       50.0    -90.0   0.0    -70.0    40.0    -100.0
WX      60.0    -80.0   80.0    -80.0   70.0    -40.0
WY      90.0    -80.0   90.0    -60.0   40.0    -100.0

我對第三種情況有疑問:

df_3 = df.groupby(['Model', 'Group', 'Case']).sum()
df_31 = df_3.groupby(['Model', 'Group']).agg([
    ('max', lambda x : x[x >= 0].sum()),
    ('min', lambda x : x[x < 0].sum())
    ])
df_31.groupby('Group').agg(['max', 'min'])

        Fx                              Fy                              Fz
        max             min             max             min             max             min
        max     min     max     min     max     min     max     min     max     min     max     min
Group                                               
G       190.0   160.0   0.0     0.0     190.0   70.0    0.0     0.0     280.0   190.0   0.0     0.0
Q       50.0    0.0     -10.0   -90.0   0.0     0.0     -70.0   -100.0  40.0    0.0     -60.0   -180.0
WX      60.0    0.0     -30.0   -120.0  150.0   0.0     0.0     -100.0  70.0    40.0    -20.0   -40.0
WY      90.0    0.0     -20.0   -80.0   170.0   80.0    0.0     -60.0   40.0    0.0     -30.0   -130.0

我無法獲得與之前格式相同的 DataFrame。

我正在尋找的結果在 max-max 和 min-min 列中。

我建議將 DataFrame 拆分為 2 個子數據幀,並分別處理每個子數據幀以聚合最小和最大,最后由concat連接在一起,更改級別由DataFrame.swaplevel和排序MultiIndex

df_3 = df.groupby(['Model', 'Group', 'Case']).sum()
df_31 = df_3.groupby(['Model', 'Group']).agg([
    ('max', lambda x : x[x >= 0].sum()),
    ('min', lambda x : x[x < 0].sum())
    ])

df_311 = df_31.xs('max', axis=1, level=1).groupby('Group').max()
df_312 = df_31.xs('min', axis=1, level=1).groupby('Group').min()

df_31 = (pd.concat([df_311, df_312], axis=1, keys=('max','min'))
           .swaplevel(1,0, axis=1)
           .sort_index(axis=1))
print (df_31)
          Fx            Fy            Fz       
         max    min    max    min    max    min
Group                                          
G      190.0    0.0  190.0    0.0  280.0    0.0
Q       50.0  -90.0    0.0 -100.0   40.0 -180.0
WX      60.0 -120.0  150.0 -100.0   70.0  -40.0
WY      90.0  -80.0  170.0  -60.0   40.0 -130.0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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