Сравнение различий в столбце в двух фреймах данных в Pandas - PullRequest
0 голосов
/ 27 сентября 2018

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

Ответы [ 3 ]

0 голосов
/ 27 сентября 2018

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

df3 = df1.copy()
df3['Status_df2'] = df2.Status.copy()
df3 = df3.loc[df3.Status != df3.Status_df2]
0 голосов
/ 27 сентября 2018

Используйте .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
0 голосов
/ 27 сентября 2018

Использование merge:

df3 = df1.merge(df2, left_index = True, right_index = True)
mask = df3['Status_x'] == df3['Status_y']
df3 = df3[~mask]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...