Pandas Compare(), как перебирать строки

Я сравниваю двух dfs с помощью панд compare()

updated_records = out['df1'].compare(out['df2']) 

    userid       amount
  self other self other
0   122  121  NaN   NaN
2  NaN   NaN  3.0   4.0

как эффективно перебирать эти строки, чтобы вывести что-то вроде этого (столбцов больше, чем этих двух, это только пример) я хочу указать, какие столбцы отображать в отчете [userid, amount, but not others ]:

First row:
UserId: 122 -> 121

Second row:
amount: 3.0 -> 4.0

Мне нужен вывод, например, для отчета:

"For item XXX_XXX those fields where updated:
UserId: 122 -> 121,
xyz: a -> b,
             "


"For item XXX_YYY those fields where updated:
amount: 3.0 -> 4.0,
xyz: 45 -> ert

В основном, чтобы показать изменения

я пытался iterrows() но меня привело к чему-то вроде этого

            other    2024-06-06T11:23:35
SaveTS       self     2024-06-06T10:36:53
             other    2024-06-06T11:23:40
A            self                     UP4
             other                    UP5
B            self     2025-02-07T00:00:00
             other    2025-02-08T00:00:00
C            self              7 FEB 2025
             other             8 FEB 2025
D            self     2025-02-07T00:00:00
             other    2025-02-08T00:00:00
E            self                     7.0
             other                    8.0

и застрял, как указано выше, я хочу выбрать A, B, C, E только для отображения в отчете об изменениях.

Спасибо

Если вы предполагаете, что в вашей выборке есть другие столбцы, включите их в качестве примера и предоставьте желаемые выходные данные, которые можно получить из вашей выборки. Также включите код для создания примера кадра данных. (Если ваш образец является многоиндексным, необходимо предоставить код для его создания.)

Panda Kim 07.06.2024 03:18
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать этот подход:

import pandas as pd

df1 = pd.DataFrame({"userid": [122, 123, 124], "amount": [1, 2, 3]})

df2 = pd.DataFrame({"userid": [121, 123, 124], "amount": [1, 2, 4]})

updated_records = df1.compare(df2)

main_cols = set([col[0] for col in updated_records.columns])

for col in main_cols:
    updated_records[f"{col}_comp"] = updated_records.apply(
        lambda row: f'{row[(col, "self")]} -> {row[(col, "other")]}', axis=1
    )

for i, row in updated_records.iterrows():
    print(f"Fields updated on row {i}:")
    for col in main_cols:
        updated = row[f"{col}_comp"].iloc[0]
        if "nan" not in updated:
            print(f"{col}: {updated}")
    print()
Fields updated on row 0:
userid: 122.0 -> 121.0

Fields updated on row 2:
amount: 3.0 -> 4.0
Ответ принят как подходящий

Пример кода

Было неясно, какой именно стиль вывода вам нужен, поэтому я привел его в качестве нового примера.

import pandas as pd
data = {
    ('userid', 'self'): [122, None],
    ('userid', 'other'): [121, None],
    ('amount', 'self'): [None, 3.0],
    ('amount', 'other'): [2, 4.0]
}

df = pd.DataFrame(data, index=[0, 2])

дф:

Код

for idx, row in df.iterrows():
    print('For item {} those fields where updated:'.format(idx))
    colums_lv0 = row[row.notna()].index.get_level_values(0).drop_duplicates()
    for col in colums_lv0:        
        print('{} : {} -> {}'.format(col, row[(col, 'self')], row[(col, 'other')]))
    print()

Распечатать:

For item 0 those fields where updated:
userid : 122.0 -> 121.0
amount : nan -> 2.0

For item 2 those fields where updated:
amount : 3.0 -> 4.0

Другие вопросы по теме