合并DataFrames时如何合并两个列表列?

时间:2015-10-19 11:18:17

标签: python pandas merge

我有两个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 个答案:

答案 0 :(得分:4)

您可以将这两列添加到一起以获取您要查找的列表,然后将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]

答案 1 :(得分: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)