[英]Getting maximum and minimum values in very complex condition in 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
我正在尋找:
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
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
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.