У меня есть два набора данных, и я пытаюсь сравнить только один столбец на основе уникального идентификатора. Я хочу отслеживать и отмечать любые изменения значений в этом столбце и выводить эти изменения в другой DF.
DF1:
ID Status
1234 Cleared
4321 Pending
5678 Distributed
8765 Validating
2468 Blocked
8642 Pending
1357 Pending
7531 Distributed
DF2:
ID Status
1234 Distributed
4321 Pending
5678 Pending
8765 Cleared
2468 Blocked
8642 Blocked
1357 Cleared
7531 Blocked
Выход:
ID Status Status
1234 Cleared Distributed
5678 Distributed Pending
8765 Validating Cleared
8642 Pending Blocked
1357 Pending Cleared
7531 Distributed Blocked
Наконец, я также пытаюсь увидеть любые изменения в другом столбце на основе изменений в столбце состояния. Этот столбец содержит список стран, использующих стандартные коды стран ISO Alpha-2. Думал о том, чтобы делать простой счетчик символов здесь, но это не имеет смысла, потому что, если США будут удалены и заменены на DE, то количество символов останется неизменным.
Мой код для всего этого (пересмотренный из других вопросов здесь) заключается в следующем, но я чувствую, что, вероятно, способ более эффективный способ сделать это...
for index, compare_row in compare_df.iterrows():
row_df1 = df1.loc[df1['ID'] == compare_row['ID']]
row_df2 = df2.loc[df2['ID'] == compare_row['ID']]
if (row_df1.iloc[0]['Status'] != row_df2.iloc[0]['Status']):
print "here 1"
output_df.append(row_df1)
output_df.append(row_df2)
elif (row_df1.iloc[0]['Status'] in ['Cleared', 'Distributed']) & (row_df1.iloc[0]['Territory'] != row_df2.iloc[0]['Territory']):
print "here 2"
output_df.append(row_df1)
output_df.append(row_df2)
Использовать merge
:
df3 = df1.merge(df2, left_index = True, right_index = True)
mask = df3['Status_x'] == df3['Status_y']
df3 = df3[~mask]
Это может быть не самый эффективный способ, но, по крайней мере, достичь цели. :)
df3 = df1.copy()
df3['Status_df2'] = df2.Status.copy()
df3 = df3.loc[df3.Status != df3.Status_df2]
Используйте .query
для повышения удобочитаемости.
DF1.merge(DF2, on = 'ID').query('Status_x != Status_y')
Выход:
ID Status_x Status_y
0 1234 Cleared Distributed
2 5678 Distributed Pending
3 8765 Validating Cleared
5 8642 Pending Blocked
6 1357 Pending Cleared
7 7531 Distributed Blocked
merge
есть параметрsuffixes
, который по умолчанию_x
и_y
для обычных столбцов. Столбец «Status
вашего «левого информационногоdf1
» (в данном случаеdf1
) будет иметь суффикс_x
по умолчанию, вы можете изменить его, передав параметры в аргумент. Для получения дополнительной информации: pandas.pydata.org/pandas-docs/stable/generated/…