2015-10-19 5 views
1

У меня есть два DataFrame:Как объединить два столбца списка при объединении DataFrames?

df1:

 date  ids 
0 2015-10-13  [978] 
1 2015-10-14 [978, 121] 

df2:

 date  ids 
0 2015-10-13 [978, 12] 
1 2015-10-14  [2, 1] 

Когда я объединить их на основе date, как показано ниже:

df = pandas.merge(df1, df2, on='date', sort=False) 

у меня будет ниже DataFrame:

date   ids_x    ids_y 
0 2015-10-13 [978]   [978, 12] 
1 2015-10-14 [978, 121]  [2, 1] 

Я хочу иметь одинids столбец слиты из обоих списков, как [978, 978, 12] или предпочтительно удаление дубликатов и иметь что-то вроде [978, 12].

ответ

2

Вы можете добавить обе колонки вместе, чтобы получить список, который вы ищете, а затем использовать df.drop() с axis=1 для удаления столбцов ids_x и ids_y. Пример -

df = pd.merge(df1, df2, on='date', sort=False) 
df['ids'] = df['ids_x'] + df['ids_y'] 
df = df.drop(['ids_x','ids_y'],axis=1) 

Demo -

In [65]: df 
Out[65]: 
     date  ids_x  ids_y 
0 2015-10-13  [978] [978, 12] 
1 2015-10-14 [978, 121]  [2, 1] 

In [67]: df['ids'] = df['ids_x'] + df['ids_y'] 

In [68]: df 
Out[68]: 
     date  ids_x  ids_y    ids 
0 2015-10-13  [978] [978, 12] [978, 978, 12] 
1 2015-10-14 [978, 121]  [2, 1] [978, 121, 2, 1] 

In [70]: df = df.drop(['ids_x','ids_y'],axis=1) 

In [71]: df 
Out[71]: 
     date    ids 
0 2015-10-13 [978, 978, 12] 
1 2015-10-14 [978, 121, 2, 1] 

Если вы хотите удалить повторяющиеся значения, а также, и вы не заботиться о порядке, то вы можете использовать Series.apply, а затем преобразовать список до set, а затем обратно до list. Пример -

df['ids'] = df['ids'].apply(lambda x: list(set(x))) 

Demo -

In [72]: df['ids'] = df['ids'].apply(lambda x: list(set(x))) 

In [73]: df 
Out[73]: 
     date    ids 
0 2015-10-13   [978, 12] 
1 2015-10-14 [121, 978, 2, 1] 

Или, как спросил в комментариях, если вы хотите сделать это с numpy.unique(), вы можете использовать его вместе с Series.apply, а также -

import numpy as np 
df['ids'] = df['ids'].apply(lambda x: np.unique(x)) 

Демо-версия -

In [79]: df['ids'] = df['ids'].apply(lambda x: np.unique(x)) 

In [80]: df 
Out[80]: 
     date    ids 
0 2015-10-13   [12, 978] 
1 2015-10-14 [1, 2, 121, 978] 
+0

Не существует способа сбросить дубликаты с помощью 'numpy.unique()', поскольку он намного эффективнее, чем 'set()'? – ALH

+1

Да, возможно, добавлено, что и ответ. –

+0

Отличный ответ. Благодарю вас за время. +1 – ALH

1

Мое решение:

df = pandas.merge(df1, df2, on='date', sort=False) 
df['ids'] = df['ids_x'] + df['ids_y'] 
df = df.drop(['ids_x','ids_y'], 1) 

Для объединения двух списков с помощью apply функции:

df['ids'] = df.apply(lambda row: list(set(row['ids'])), axis=1) 
+0

Благодарим за ответ. +1 – ALH

Смежные вопросы