Как условно объединить две колонки - PullRequest
0 голосов
/ 31 октября 2018

У меня есть такой фрейм данных:

df_ex_A = pd.DataFrame({'X':['r','r','t','t','v','w'],
                        'A':[3,4,1,2,1,1],
                        'A_val':[25,25,100,20,10,90]})
 Out[115]: 
  X  A  A_val
0 r  3     25
1 r  4     25
2 t  1     100
3 t  2     20
4 v  1     10
5 w  1     90

и другой df, как это:

df_ex_B = pd.DataFrame({ 'X':['r','r','t','t','v','w'],
                    'B':[4,5,2,3,2,2],
                    'B_val':[75,65,30,0,0,0]})
    Out[117]: 
  X  B   B_val
0 r  4     75
1 r  5     65
2 t  2     30
3 t  3      0
4 v  2      0
5 w  2      0

Я хочу создать df с помощью операций слияния с равными значениями A и B, например:

   X  (A==B)  A_val   B_val
0  r     3     25       0
1  r     4     25       75
2  r     5     0        65
3  t     1     1        0
4  t    2     20       30
5  t     3      0       0
6  v     1     10       0
7  v     2      0       0
8  w     1     90       0
9  w     2     0        0

как выполнить слияние, чтобы получить этот df? Спасибо

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Я думаю, что вы хотите outer join, который можно сделать с помощью merge, указав how='outer':

df_ex_A.merge(df_ex_B.rename(columns={'B':'A'}), how='outer').fillna(0).rename(columns={'A':'A==B'})
0 голосов
/ 31 октября 2018

Давайте попробуем использовать set_index и pd.concat:

dfA = df_ex_A.set_index(['X','A']).rename_axis(['X','A==B'])

dfB = df_ex_B.set_index(['X','B']).rename_axis(['X','A==B'])

pd.concat([dfA,dfB], axis=1).fillna(0).reset_index()

Выход:

   X  A==B  A_val  B_val
0  r     3   25.0    0.0
1  r     4   25.0   75.0
2  r     5    0.0   65.0
3  t     1  100.0    0.0
4  t     2   20.0   30.0
5  t     3    0.0    0.0
6  v     1   10.0    0.0
7  v     2    0.0    0.0
8  w     1   90.0    0.0
9  w     2    0.0    0.0

Или вы можете использовать join после установки индексов и переименования оси:

dfA.join(dfB, how='outer').fillna(0).reset_index()

Выход:

   X  A==B  A_val  B_val
0  r     3   25.0    0.0
1  r     4   25.0   75.0
2  r     5    0.0   65.0
3  t     1  100.0    0.0
4  t     2   20.0   30.0
5  t     3    0.0    0.0
6  v     1   10.0    0.0
7  v     2    0.0    0.0
8  w     1   90.0    0.0
9  w     2    0.0    0.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...