我有以下数据集。我需要根据条件在新列Col A * B * C * D * E
中Score
:
如果ID
和VID
相同,但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
降序或升序,然后进行计算,但是无法在计算后编写逻辑。只是一个尝试解决这个问题几天的初学者。
答案 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