Сравнение различий в столбце в двух фреймах данных в Pandas

1

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

3 ответа

2

Использовать merge:

df3 = df1.merge(df2, left_index = True, right_index = True)
mask = df3['Status_x'] == df3['Status_y']
df3 = df3[~mask]
  • 0
    Привет и спасибо за ответ! У меня возникли проблемы с пониманием решения здесь. Будет ли вывод выровнять столбцы «Status» из обоих dfs, если есть какие-либо изменения, в df3?
  • 0
    Здравствуйте, @KirklandShawty. В merge есть параметр suffixes , который по умолчанию _x и _y для обычных столбцов. Столбец « Status вашего «левого информационного df1 » (в данном случае df1 ) будет иметь суффикс _x по умолчанию, вы можете изменить его, передав параметры в аргумент. Для получения дополнительной информации: pandas.pydata.org/pandas-docs/stable/generated/…
0

Это может быть не самый эффективный способ, но, по крайней мере, достичь цели. :)

df3 = df1.copy()
df3['Status_df2'] = df2.Status.copy()
df3 = df3.loc[df3.Status != df3.Status_df2]
0

Используйте .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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню