Я сравниваю двух 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 только для отображения в отчете об изменениях.
Спасибо
Вы можете использовать этот подход:
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
Если вы предполагаете, что в вашей выборке есть другие столбцы, включите их в качестве примера и предоставьте желаемые выходные данные, которые можно получить из вашей выборки. Также включите код для создания примера кадра данных. (Если ваш образец является многоиндексным, необходимо предоставить код для его создания.)