Сравнение последовательных строк данных на основе столбцов в Python - PullRequest
0 голосов
/ 19 января 2019

У меня есть датафрейм.Имеются данные о поставщиках.Если имя поставщика и группы совпадают, в идеале количество единиц должно быть одинаковым.Однако иногда это не так.Я пишу код, который импортирует данные из 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. Я хочу добавить еще один столбец к этому фрейму данных, который говорит «Ложь», если число единиц правильное.Это сложная часть для меня.Я могу перемещаться по строкам, но не уверен, как их сравнить и добавить столбец.

Я застрял в этой точке.Любая помощь высоко ценится.Спасибо.

1 Ответ

0 голосов
/ 19 января 2019

Если у вас есть все ваши данные в одном фрейме данных, 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'), который является первым значением «Единицы» для каждой группы Поставщика / ID / Grp (см. grp_by_cols).

Второй вызов assign добавляет столбец с именем 'incorrect', то есть True, когда 'Unit' не равен 'first_unit'. Третий и последний вызов assign заменяет этот столбец на True, если любые строки в этой группе True. Вы можете удалить это, если это не то, что вы хотите.

Затем, если вы хотите посмотреть результаты для одного поставщика, вы можете сделать что-то вроде:

res_df.query('Supplier = "Authentic Brands Group"')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...