根据数据框的不同列添加和乘以更高的值

数据挖掘 Python 熊猫 python-3.x
2022-03-13 10:11:45

我正在尝试根据数据框中的不同值计算分数。由于这些分数基于不同的条件,我在最终计算中遇到问题,我需要在新列中,Col E如果两列中有相似的值,我需要在其中一个列()中选择更高的数字( Col ID & VID) 并且在一列中是唯一的 ( Col QID)。

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

最后一行展示Col ID, VID, QID and E可以相同但由于Col A, B, C and D不同,因此会导致不同的分数。(较高值)的乘积Columns A, B, C, D and E应该在Col Score. 预期结果如下:

ID     VID     QID     A     B     C     D     E     Score
121    212     123     1     2     1     1     1     2
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     20
454    969     457     1     3     2     2     4     48
454    969     457     1     2     1     2     4     16

计算类似于 A * B * C * D * E 列。用于Score基于相似的 ID 和 VID 但唯一的 QID 计算。

较高的值Col E可以是第一个或最后一个。如果可以通过 groupby 然后合并它们以获得上面的结果,那么这也解决了这个目的。

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

提前致谢!

1个回答

因此,根据我对问题的理解,您希望创建一个 Score 列,通常是:

Score=A×B×C×D×E

如果 ID == VID 并且该条目的 QID 中的值在整个数据帧中是唯一的,则E=max(E)

为此,我将创建额外的列,在制作分数列之前检查这些条件。因此,我会推荐这个:

import numpy as np
import pandas as pd

# unique QID
QID_counts = df.groupby("QID").size().reset_index()
QID_counts.columns = ["QID", "QID_count"]

df = pd.merge(left = df, right = QID_count, on = "QID")

# checking if IDs are equal to VID
df["ID_VID"] = df[df["ID"] == df["VID"]]
df["Unique_QID"] = df[df["QID_count"] == 1]

# checking if both conditions are met
df["Max E"] = df["ID_VID"] & df["Unique_QID"]
df["Max E"] = df["Max E"].astype(int)
# obtaining indices 
max_E_idxs = df[df["Max E"] == 1].index

# updating E to suit conditions
df["Score_E"] = df["E"]
df.loc[max_E_idxs,"Score_E"] = np.max(df["E"])

# creating score
df["Score"] = df["A"] * df["B"] * df["C"] * df["D"] * df["Score_E"]
```