Различия панд между фреймом данных в соответствии с пользовательскими правилами - PullRequest
2 голосов
/ 19 сентября 2019

Это упрощенный пример того, что я хочу сделать:

data1 = {'one':['A', 'E', 'G'], 'two':['B', 'D', 'H'], 'three':['C', 'F', 'J']}
df1 = pd.DataFrame(data1) 
df1

   one  two three
0   A   B   C
1   E   D   F
2   G   H   J

data2 = {'one':['C', 'F', 'P'], 'two':['B', 'D', 'R'], 'three':['A', 'E', 'C']}
df2 = pd.DataFrame(data2) 
df2

    one two three
0   C   B   A
1   F   D   E
2   P   R   C

Я хочу, чтобы функция показала мне что-то вроде этого:

diff(df1, df2) # this syntaks can be different

    one two three  from
0   G   H   J      df1
1   P   R   C      df2

По сути, найти полученный текст для столбцадва в обоих dataFrames, и если один и три столбца перевернуты, то это нормально, не добавляйте его в новый кадр.

Я знаю, как сделать это с помощью цикла, но хотел бы знать, что такое способ панды.

Ответы [ 2 ]

3 голосов
/ 19 сентября 2019

Использование pandas.Index.symmetric_difference

df1.set_index(df1.apply(frozenset, 1), inplace=True)
df2.set_index(df2.apply(frozenset, 1), inplace=True)

df1['from'] = 'df1'
df2['from'] = 'df2'

new_df = pd.concat([df1, df2]).loc[df1.index ^ df2.index].reset_index(drop=True)

print(new_df)

Вывод:

  one three two from
0   G     J   H  df1
1   P     C   R  df2
1 голос
/ 19 сентября 2019

Достаточно просто, просто сравните столбцы, которые вы хотите, чтобы они были одинаковыми, и отфильтруйте их.В вашем примере:

pd.concat([df.loc[df1["two"] != df2["two"]] for df in (df1, df2)], axis=0)

РЕДАКТИРОВАТЬ: если вы также хотите столбец "из", измените вышеприведенную строку на:

pd.concat([df.loc[df1["two"] != df2["two"]].assign(from_df=df_name) for df, df_name in zip((df1, df2), ("df1", df2)], axis=0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...