根据不同列的if条件创建新列

2024-09-29 23:15:25 发布

您现在位置:Python中文网/ 问答频道 /正文

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

其中ifID&VID相同,但QID是唯一的或不同的,请在计算新列Score时从Col E中选择较高的值

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采用降序或升序格式,然后进行计算,但无法编写计算背后的逻辑。我只是一个初学者,几天来一直在努力解决这个问题


Tags: andto数据idoncol条件based
2条回答

^{}用于OVERVITE列E按每个组的最大值,然后按^{}乘以所有列,并选择忽略前3个^{}

df['Score'] = (df.assign(E = df.groupby(['ID','VID'])['E'].transform('max'))
                 .iloc[:, 3:]
                 .prod(axis=1))
print (df)
    ID  VID  QID  A  B  C  D  E  Score
0  121  212  123  1  2  1  1  1     10
1  121  212  435  1  2  1  1  5     10
2  223  244  567  2  3  5  1  2     60
3  313  232  709  5  1  2  1  3     30
4  313  232  887  5  1  2  1  2     30
5  454  969  457  1  3  2  2  4     48
6  454  969  457  1  2  1  2  4     16

详细信息

print (df.groupby(['ID','VID'])['E'].transform('max'))
0    5
1    5
2    2
3    3
4    3
5    4
6    4
Name: E, dtype: int64

我可能把解决方案复杂化了一点,但在我看来,快速解决方案就是这样的:

第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

相关问题 更多 >

    热门问题