首页 > 解决方案 > 根据不同列的 if 条件创建新列

问题描述

我有以下数据集。我需要根据条件Col A * B * C * D * E在新列中:Score

如果ID&VID相同,但QID唯一或不同,则Col E在计算新列时选择较高的值Score

ID     VID     QID     A     B     C     D     E
121    212     123     1     2     1     1     1
121    212     435     1     2     1     1     5
223    244     567     2     3     5     1     2
313    232     709     5     1     2     1     3
313    232     887     5     1     2     1     2
454    969     457     1     3     2     2     4
454    969     457     1     2     1     2     4

预期的结果是这样的:

ID     VID     QID     A     B     C     D     E     Score
121    212     123     1     2     1     1     1     10 (because based on ID and VID I want to choose higher value in column E while calculating, and apply the same to those rows)
121    212     435     1     2     1     1     5     10
223    244     567     2     3     5     1     2     60
313    232     709     5     1     2     1     3     30
313    232     887     5     1     2     1     2     30
454    969     457     1     3     2     2     4     48
454    969     457     1     2     1     2     4     16

我曾尝试.sort引入Col E降序或升序格式,然后进行计算,但无法编写计算背后的逻辑。现在只是一个初学者试图解决这个问题几天。

标签: pythonpython-3.xpandas

解决方案


我可能会使解决方案过于复杂,但这就是我认为快速解决方案的样子:

第 1 部分:计算 QID 的唯一计数和 E 的最大值

df_tempA = df.groupby(["ID", "VID"]).agg({
    'QID':"nunique",
    'E': "max"
}).reset_index().rename(columns={'QID':"QIDCount",'E':"MaxE"})

print(df_tempA)   
    ID  VID  QIDCount  MaxE
0  121  212         2     5
1  223  244         1     2
2  313  232         2     3
3  454  969         1     4

第 2 部分:加入原始数据框

df_result = pd.merge(df, df_tempA, on=["ID", "VID"])

print(df_result)
    ID  VID  QID  A  B  C  D  E  QIDCount  MaxE
0  121  212  123  1  2  1  1  1         2     5
1  121  212  435  1  2  1  1  5         2     5
2  223  244  567  2  3  5  1  2         1     2
3  313  232  709  5  1  2  1  3         2     3
4  313  232  887  5  1  2  1  2         2     3
5  454  969  457  1  3  2  2  4         1     4
6  454  969  457  1  2  1  2  4         1     4

第 3 部分:根据条件创建分数列

df_result['Score'] = df_result.apply(lambda df: df['A']*df['B']*df['C']*df['D']*df['E'] 
                                    if df['QIDCount'] ==1 
                                    else df['A']*df['B']*df['C']*df['D']*df['MaxE'], 
                                    axis=1)

print(df_result)
    ID  VID  QID  A  B  C  D  E  QIDCount  MaxE  Score
0  121  212  123  1  2  1  1  1         2     5     10
1  121  212  435  1  2  1  1  5         2     5     10
2  223  244  567  2  3  5  1  2         1     2     60
3  313  232  709  5  1  2  1  3         2     3     30
4  313  232  887  5  1  2  1  2         2     3     30
5  454  969  457  1  3  2  2  4         1     4     48
6  454  969  457  1  2  1  2  4         1     4     16

推荐阅读