我有一个数据框。它具有有关供应商的数据。如果供应商名称和组名相同,则理想情况下单位数应相同。但是,有时情况并非如此。我正在编写代码,将数据从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)
这给了我一个小的子集,像这样:
现在,我要查看供应商名称和Grp,如果它们与数据框中的其他名称相同,则单位应该相同。在这种情况下,第2行不正确。单位应为100。如果单位数正确,我想在此数据框中添加另一列,显示“ False”。这对我来说是棘手的部分。我可以遍历行,但是不确定如何比较它们并添加列。
我被困在这一点上。 非常感谢您的帮助。谢谢。
答案 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"')