Как условно объединить столбцы Dataframe - PullRequest
0 голосов
/ 14 марта 2020

У меня есть два dfs:

df1

  Person   Dept      Date    Company   ID  Value
0   Faye  Sales  12/31/16  FB Co Inc  123     27
1   Faye  Sales   3/31/17    Unknown  123     34
2    Ray    Eng   3/31/18     xyz co  345     59
3    Ray     HR   6/30/18        XyZ  345     54
4    Jay     HR   9/30/18          A  678     53
5    Jim    Ops   9/30/16        New  999      8

и df2

    Company     Symbol   ID
0    FB Inc         FB  123
1  XYZ Corp  No Symbol  345
2     A LLC         AA  678
3  EFG Corp        EFG  555

Я хочу:

  1. объединить в ID
  2. заменить Company в df1 на аккуратно отформатированный в df2 (но также сохранить Company из df1, если нет совпадений в df2)
  3. добавить Symbol из df2 в df1

, чтобы результат выглядел следующим образом:

  Person   Dept      Date    Company    Symbol   ID  Value
0   Faye  Sales  12/31/16     FB Inc        FB  123     27
1   Faye  Sales   3/31/17     FB Inc        FB  123     34
2    Ray    Eng   3/31/18   XYZ Corp  No Symbol 345     59
3    Ray     HR   6/30/18   XYZ Corp  No Symbol 345     54
4    Jay     HR   9/30/18      A LLC         AA 678     53
5    Jim    Ops   9/30/16        New        NaN 999      8

Doing df3 = pd.merge(df1, df2, on='ID', how='left').drop('Company_x', axis=1) приближает меня, но не сохраняет Company из df1, когда совпадение не найдено в df2 (Nan против New):

  Person   Dept      Date   ID  Value Company_y     Symbol
0   Faye  Sales  12/31/16  123     27    FB Inc         FB
1   Faye  Sales   3/31/17  123     34    FB Inc         FB
2    Ray    Eng   3/31/18  345     59  XYZ Corp  No Symbol
3    Ray     HR   6/30/18  345     54  XYZ Corp  No Symbol
4    Jay     HR   9/30/18  678     53     A LLC         AA
5    Jim    Ops   9/30/16  999      8       NaN        NaN

Как сделать Я это исправлю?

Ответы [ 2 ]

1 голос
/ 14 марта 2020

Просто измените свой код с помощью fillna

df3 = pd.merge(df1, df2, on='ID', how='left')
df3.Company_y.fillna(df3.Company_x, inplace=True) # here is fillna with two value 
df3=df3.drop('Company_x', 1)
0 голосов
/ 14 марта 2020

это работало также с np.where и .notnull() logi c? Ваш ввод не был хорошо скопирован / вставлен.

df3 = pd.merge(df1, df2, on='ID', how='left')
df3['Company_x'] = np.where(df3['Company_y'].notnull(),
                            df3['Company_y'], df3['Company_x'])
df3 = df3.drop('Company_x', axis=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...