Pandas выполнение concat вместо слияния при выполнении операции слияния - PullRequest
1 голос
/ 02 августа 2020

У меня есть два фрейма данных, df1:

                      name              mark
     0               Alex  [Tue, 0.0, 10, 0.0, 0.0]
     1               John  [Tue, 0.0, 10, 0.0, 0.0]
     2                Tom  [Tue, 0.0, 10, 0.0, 0.0]
     3                Tim  [Tue, 0.0, 10, 0.0, 0.0]

и df2:

           name        mark1
   0       Alex  [11.0, 0.0, 1.0]
   1       John  [12.0, 0.0, 4.0]
   2        Tom  [12.0, 0.0, 4.0]

, и когда я это сделаю:

merged = pd.merge(df1,df2,how='outer',on='name').fillna(0)

я ожидал получить что-то вот так:

                 name              mark                   mark1
     0           Alex  [Tue, 0.0, 10, 0.0, 0.0]   [11.0, 0.0, 1.0]
     1           John  [Tue, 0.0, 10, 0.0, 0.0]   [12.0, 0.0, 4.0]
     2            Tom  [Tue, 0.0, 10, 0.0, 0.0]   [12.0, 0.0, 4.0]
     3            Tim  [Tue, 0.0, 10, 0.0, 0.0]        0

но у меня что-то вроде этого (которое больше похоже на concat):

                 name              mark              mark1
     0           Alex  [Tue, 0.0, 10, 0.0, 0.0]       0
     1           John  [Tue, 0.0, 10, 0.0, 0.0]       0
     2            Tom  [Tue, 0.0, 10, 0.0, 0.0]       0
     3            Tim  [Tue, 0.0, 10, 0.0, 0.0]       0
     4           Alex          0                [11.0, 0.0, 1.0]
     5           John          0                [12.0, 0.0, 4.0]
     6            Tom           0               [12.0, 0.0, 4.0]

может кто-нибудь, пожалуйста, скажите мне, что я делаю не так? так что это весь мой код:

                       name              mark
     0                Alex   [Mon, 10.12, 12, 10.0, 17.0]
     1                Alex   [Wed, 10.12, 15, 10.0, 17.0]
     2                Alex   [Fri, 10.12, 7, 10.0, 17.0]
     3                Alex   [Tue, 0.0, 10, 0.0, 0.0]
     4                Alex   [Thu, 0.0, 16, 0.0, 0.0]
     5                Alex   [Sat, 0.0, 2, 0.0, 0.0]
     6                Alex   [Sun, 0.0, 12, 0.0, 0.0]
     7                John   [Fri, 10.12, 7, 10.0, 17.0]
     8                John   [Mon, 10.12, 12, 10.0, 17.0]
     9                John   [Tue, 0.0, 10, 0.0, 0.0]
    10               John   [Wed, 0.0, 15, 0.0, 0.0]
    11               John   [Thu, 0.0, 16, 0.0, 0.0]
    12               John   [Sat, 0.0, 2, 0.0, 0.0]
    13               John   [Sun, 0.0, 12, 0.0, 0.0]
    14                Tom  [Wed, 10.12, 15, 10.0, 17.0]
    15                Tom  [Mon, 10.12, 12, 10.0, 17.0]
    16                Tom   [Fri, 10.12, 7, 10.0, 17.0]
    17                Tom   [Tue, 0.0, 10, 0.0, 0.0]
    18                Tom   [Thu, 0.0, 16, 0.0, 0.0]
    19                Tom   [Sat, 0.0, 2, 0.0, 0.0]
    20                Tom   [Sun, 0.0, 12, 0.0, 0.0]
    21                Tim  [Mon, 10.12, 12, 10.0, 17.0]
    22                Tim  [Fri, 10.12, 7, 10.0, 17.0]
    23                Tim   [Tue, 0.0, 10, 0.0, 0.0]
    24                Tim   [Wed, 0.0, 15, 0.0, 0.0]
    25                Tim   [Thu, 0.0, 16, 0.0, 0.0]
    26                Tim   [Sat, 0.0, 2, 0.0, 0.0]
    27                Tim   [Sun, 0.0, 12, 0.0, 0.0]

, а затем я делаю:

df = (df.groupby(['name'])['mark'].apply(list).apply(lambda x: [list(y) for y 
                 in set([tuple(j) for j in x])]).reset_index())

, что дает мне:

                  name                                               mark
 0               Alex  [[Tue, 0.0, 10, 0.0, 0.0], [Sun, 0.0, 12, 0.0,...
 1               John  [[Tue, 0.0, 10, 0.0, 0.0], [Sun, 0.0, 12, 0.0,...
 2                Tom  [[Tue, 0.0, 10, 0.0, 0.0], [Sun, 0.0, 12, 0.0,...
 3                Tim  [[Tue, 0.0, 10, 0.0, 0.0], [Sun, 0.0, 12, 0.0,...

второй фрейм данных также получается путем выполнения что-то вроде этого. (извините за то, что не разместил точный фрейм данных, потому что это было немного грязно)

Ответы [ 2 ]

1 голос
/ 02 августа 2020

Следующее должно работать:

merged = df1.merge(df2, how='left',on='name').fillna(0)

Это потому, что при слиянии вы выполняете полное внешнее соединение.

1 голос
/ 02 августа 2020

Объединить слева, в столбце 'name'

df1.merge(df2, how='left',on='name')

  name                     mark               mark1
0  Alex  [Tue, 0.0, 10, 0.0, 0.0]   [11.0, 0.0, 1.0]
1  John  [Tue, 0.0, 10, 0.0, 0.0]   [12.0, 0.0, 4.0]
2   Tom  [Tue, 0.0, 10, 0.0, 0.0]   [12.0, 0.0, 4.0]
3   Tim  [Tue, 0.0, 10, 0.0, 0.0]                NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...