根据其他列的if条件创建一个新列

时间:2020-06-08 09:48:27

标签: python python-3.x pandas

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

如果IDVID相同,但QID唯一或不同,则在计算新列{{1}时从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降序或升序,然后进行计算,但是无法在计算后编写逻辑。只是一个尝试解决这个问题几天的初学者。

2 个答案:

答案 0 :(得分:3)

我可能会使解决方案有些复杂,但这是快速解决方案在我看来的样子:

第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

答案 1 :(得分:2)

使用DataFrame.transform通过每组最大值覆盖列E,然后以DataFrame.prod覆盖所有列,而忽略前3个被选中的DataFrame.iloc

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