Возьмите объединение двух фреймов данных и добавьте столбец соответственно отдельно - PullRequest
0 голосов
/ 28 мая 2018

У меня есть два фрейма данных, и мне нужно создать некое объединение этих двух фреймов данных (из первого столбца «A»).

df1 = pd.DataFrame({'A' : ['a','b','c'], 'B' : [10,20,30], 'C' : [2,5,3]})
df2=  pd.DataFrame({'A' : ['a','b','d'], 'B' : [34,21,45], 'C' : [1,5,5]})

output-

   A   f_M   d_M  f_B  d_B
0  a   10     2    34   1
1  b   20     5    21   5
2  c   30     3     0   0
3  d   0      0    45   5

Это новый созданный фрейм данных, в котором объединены два фрейма данных столбца ('A'). Столбец f_M равен if 'B'columnимеет значение в df1 и f_B для, если он находится в df2 и 0, если не в любом из df1 / df2.

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Это похоже на классический вариант использования для внешнего merge:

df1.merge(df2, on='A', how='outer', suffixes=('_M', '_B')).fillna(0)

   A   B_M  C_M   B_B  C_B
0  a  10.0  2.0  34.0  1.0
1  b  20.0  5.0  21.0  5.0
2  c  30.0  3.0   0.0  0.0
3  d   0.0  0.0  45.0  5.0

Для учета столбцов используйте map с DataFrame.rename:

pd.merge(*map(
      lambda x: x.rename(columns={'B':'f','C':'d'}), (df1, df2)
   ), on='A', how='outer', suffixes=('_M', '_B')
).fillna(0)

   A   f_M  d_M   f_B  d_B
0  a  10.0  2.0  34.0  1.0
1  b  20.0  5.0  21.0  5.0
2  c  30.0  3.0   0.0  0.0
3  d   0.0  0.0  45.0  5.0
0 голосов
/ 28 мая 2018

Используйте concat с set_index и для избежания дублирования имен столбцов add_suffix:

d = {'B':'f','C':'d'}
df = (pd.concat([df1.set_index('A').rename(columns=d).add_suffix('_M'), 
                df2.set_index('A').rename(columns=d).add_suffix('_B')], axis=1)
        .fillna(0)
        )
print (df)
    f_M  d_M   f_B  d_B
a  10.0  2.0  34.0  1.0
b  20.0  5.0  21.0  5.0
c  30.0  3.0   0.0  0.0
d   0.0  0.0  45.0  5.0

И дляколонка:

d = {'B':'f','C':'d'}
df = (pd.concat([df1.set_index('A').rename(columns=d).add_suffix('_M'), 
                df2.set_index('A').rename(columns=d).add_suffix('_B')], axis=1)
        .fillna(0)
        .rename_axis('A')  
        .reset_index()
        )
print (df)
   A   f_M  d_M   f_B  d_B
0  a  10.0  2.0  34.0  1.0
1  b  20.0  5.0  21.0  5.0
2  c  30.0  3.0   0.0  0.0
3  d   0.0  0.0  45.0  5.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...