несколько операций слияния на двух фреймах данных с использованием pandas - PullRequest
0 голосов
/ 05 мая 2020

У меня есть два фрейма данных, в которых должно быть реализовано несколько операций, например:

old_DF

id   col1   col2    col3
-------------------------
1    aaa        
2           bbb     123

new_DF

id   col1   col2    col3
-------------------------
1           xxx      999
2    xxx    kkk 

С этими фреймами данных необходимо выполнить следующие операции:

  1. Объединение двух фреймов данных
  2. Замена только пустых ячеек в old_DF соответствующими значениями from new_DF
  3. Ячейки из обоих фреймов данных, значения которых противоречат друг другу, должны быть представлены в новом фрейме данных

Желаемые результаты:

updated_df

id   col1   col2    col3
-------------------------
1    aaa    xxx     999
2    xxx    bbb     123

config_df

id   col1   col2    col3
-------------------------
2           bbb
2           kkk     

Я могу использовать метод .append() для объединения двух фреймов данных, и я думаю, можно использовать методы .bfil() или .ffil(), чтобы заполнить отсутствующие ценности. Но у меня не получилось и с .bfil(), и с .ffil(). Я пробовал df.groupby('id').apply(lambda x: x.ffill().bfill()).drop_duplicates(), но не получил желаемых результатов. Кроме того, я не понимаю, как выполнить шаг 3, упомянутый выше. Есть кто-нибудь, кто может помочь с этой проблемой?

1 Ответ

0 голосов
/ 05 мая 2020

настройка:

old_df = pd.DataFrame([
  [1, 'aaa', pd.NA, pd.NA],
  [2, pd.NA, 'bbb', 123]],
  columns=['id', 'col1', 'col2', 'col3'])
new_df = pd.DataFrame([
  [1, pd.NA, 'xxx', 999],
  [2, 'xxx', 'kkk', pd.NA]],
  columns=['id', 'col1', 'col2', 'col3'])

Используйтеcommon_first, чтобы получить updated_df, установив id в качестве индекса

old_df = old_df.set_index('id')
new_df = new_df.set_index('id')
updated_df = old_df.combine_first(new_df)

# updated_df outputs:
# (reset the id if necessary)
   col1 col2 col3
id               
1   aaa  xxx  999
2   xxx  bbb  123

сгенерируйте фрейм данных masks с использованием логических логических значений c, проверяя, что и старый, и новый кадры имеют значения в данной ячейке и что значения различаются, и выбираем ячейки как из старого, так и из нового, используя маску, где любая строка в маске имеет значение True

mask = pd.notnull(new_df) & ~old_df.eq(new_df) & pd.notnull(old_df)
conflicts_df = pd.concat([old_df[mask], new_df[mask]]).dropna(how='all')

# conflicts_df outputs
   col1 col2 col3
id               
2   NaN  bbb  NaN
2   NaN  kkk  NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...