我有两个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]
的内容。
答案 0 :(得分:4)
您可以将这两列添加到一起以获取您要查找的列表,然后将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)
演示 -
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)