如何在Python中比较行以查看值的差异?

如何在Python中比较行以查看值的差异?,python,pandas,Python,Pandas,我想基本上得到一个列表,其中所有项目的总数与每周项目的总和不匹配 csv的列标题为名称、类型、EMPID、年份、期间、唯一ID和值。 在理想的场景中,脚本中的逻辑应该返回这样的实例:当相同的EmpID和相同的年份和相同的uniqueID和相同的名称和相同的类型-**那么总计不应该等于(第1周+第2周+第3周+第4周)** 如果总数等于每周项目的总和,我们不希望这样 当我不得不与总值和每周行的总和进行比较时,我感到困惑。请下次提供一个易于复制的数据帧示例 #df = your_dataframe

我想基本上得到一个列表,其中所有项目的总数与每周项目的总和不匹配

csv的列标题为名称、类型、EMPID、年份、期间、唯一ID和值。 在理想的场景中,脚本中的逻辑应该返回这样的实例:当相同的EmpID和相同的年份和相同的uniqueID和相同的名称和相同的类型-**那么总计不应该等于(第1周+第2周+第3周+第4周)**

如果总数等于每周项目的总和,我们不希望这样


当我不得不与总值和每周行的总和进行比较时,我感到困惑。

请下次提供一个易于复制的数据帧示例

#df = your_dataframe.copy()

df_totals = df[df["Period"]=="Total"]
df_without_totals = df[df["Period"]!="Total"]

df_without_totals = df_without_totals.groupby(["Name", "Type", "EmpID", "Year", "uniqueID"])["Value"].sum().reset_index().rename(columns={"Value":"Summed_Value"})

df_compare = df_totals.reset_index().merge(df_without_totals, on=["Name", "Type", "EmpID", "Year", "uniqueID"], how="left").set_index("index")

df_compare[df_compare["Value"] != df_compare["Summed_Value"]]

我建议您按ID和周期进行透视,并反复比较周数和总周数。这就是下面的代码所做的,如果周的总和不等于总数,它将打印唯一的ID。请让我知道这是否有帮助

假设数据集的名称为df:

for ID, Period in df.groupby('UniqueID'):
    By_ID = Period.groupby('Period').sum()
    Week_Sum = sum(By_ID['Value'])
    Total = By_ID['Value'][0]
    if Week_Sum - Total != Total:
        print(ID)

它在您发布的数据上给出的答案是IDs 2和IDs 3。

有没有办法选择周,而不使用df_而不使用_totals=df[df[“Period”!=“Total”]?如果我有第5周,只想要前4周呢?是的,你可以这样做:在[“week1”,“week2”,“week3”,“week4”]]中使用没有总计的df_=df[df[“Period”]在[“week1”,“week2”,“week3”,“week4”]:值错误:序列的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all()。你是对的,我的坏朋友,试试:df[df[“Period”].map(lambda x:x in[“week1”、“week2”、“week3”、“week4”])谢谢!这真的很有帮助!我还有一个问题。是否有任何代码我可以写,这将使逻辑运行时,只有当所有Week1,week2,week3和week4存在?例如,对于第3周不存在的项目,我想将其从结果中删除,然后继续下一个项目。