2015-10-19 196 views
1

我有兩個DataFrame如何在合併DataFrame時合併兩個列表列?

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_xids_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) 

演示 -

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))) 

演示 -

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