根据Python中的列比较连续的数据框行

时间:2019-01-18 23:58:56

标签: python dataframe

我有一个数据框。它具有有关供应商的数据。如果供应商名称和组名相同,则理想情况下单位数应相同。但是,有时情况并非如此。我正在编写代码,将数据从SQL导入Python,然后对这些数字进行比较。

这是针对Python 3的。将数据导入Python很容易。我是Python新手。为了让我自己更轻松,我为每个供应商创建了单独的数据框以比较数字,而不是一次查看整个数据框。

supp = data['Supplier']
supplier = []
for s in supp:
    if s not in Supplier:
        supplier.append(s)

su = "Authentic Brands Group LLC"
deal = defaultdict(list)
blist = []
glist = []
columns = ['Supplier','ID','Units','Grp']
df3 = pd.DataFrame(columns=columns)
def add_row(df3, row):
    df3.loc[-1] = row
    df3.index = df3.index + 1  
    return df3.sort_index()

for row in data.itertuples():
    for x in supplier:
        s1 = row.Supplier
        if  s1 == su:
            if row.Supplier_Group not in glist:
                glist.append(row.Supplier_Group)
            for g in range(len(glist)):
                if glist[g]==row.Supplier_Group:
                    supp = x
                    blist=[]
                    blist.append(row.ID)
                    blist.append(row.Units)
                    blist.append(glist[g])
                    add_row(df3,[b1,row.ID,row.Units,glist[g]])   
                    break
            break                     
        break
for i in range(1,len(df3)):
    if df3.Supplier.loc[i] == df3.Supplier.loc[i-1] and df3.Grp.loc[i] == df3.Grp.loc[i-1]:
        print(df3.Supplier,df3.Grp)  

这给了我一个小的子集,像这样:

enter image description here

现在,我要查看供应商名称和Grp,如果它们与数据框中的其他名称相同,则单位应该相同。在这种情况下,第2行不正确。单位应为100。如果单位数正确,我想在此数据框中添加另一列,显示“ False”。这对我来说是棘手的部分。我可以遍历行,但是不确定如何比较它们并添加列。

我被困在这一点上。 非常感谢您的帮助。谢谢。

1 个答案:

答案 0 :(得分:0)

如果所有数据都在一个数据帧df中,则可以执行以下操作:

grp_by_cols = ['Supplier', 'ID', 'Grp']
all_cols = grp_by_cols + ['Unit']
res_df = df.assign(first_unit=lambda df: df.loc[:, all_cols]
                                           .groupby(grp_by_cols)
                                           .transform('first'))\
           .assign(incorrect=lambda df: df['Unit'] == df['first_unit'])\
           .assign(incorrect=lambda df: df.loc[:, grp_by_cols + ['incorrect']])\
                                          .groupby(grp_by_cols)
                                          .transform(np.any))

第一次调用assign会添加一个新列(称为'first_unit'),该列是每组Supplier / ID / Grp组的“单位”的第一个值(请参阅grp_by_cols )。

assign的第二次调用将添加一个名为'incorrect'的列,当True不等于'Unit'时,该列为'first_unit'。如果该组中的任何行为assign,则第三个也是最后一个True调用会将该列覆盖为True。如果那不是您想要的,可以将其删除。

然后,如果您要查看单个供应商的结果,则可以执行以下操作:

res_df.query('Supplier = "Authentic Brands Group"')
相关问题