我有两只熊猫df
,它们的长度不一样。df1
在id
列中有唯一的id。这些id在df2.colA
中出现(多次)。我想将df2.colA
中df1.id
的所有出现列表(以及df1.id == df2.colA
匹配索引的另一列)添加到df1
中的新列中。可以使用匹配的df2.colA
索引,也可以使用所有匹配的其他行项。
的例子:
df1.id = [1, 2, 3, 4]
df2.colA = [3, 4, 4, 2, 1, 1]
df2.colB = [5, 9, 6, 5, 8, 7]
所以我的操作创建了如下内容:
df1.colAB = [ [[1,8],[1,7]], [[2,5]], [[3,5]], [[4,9],[4,6]] ]
我尝试了一堆映射方法,显式循环(超慢),检查isin
等。
您可以使用Pandasapply
来遍历df1
值的每一行,同时创建包含df2.colA
中所有索引的列表。这可以通过在df2.colB
上使用Pandasindex
和loc
来创建一个包含df2.colA
中与df1.id
中的行匹配的所有索引的列表来实现。然后,在apply
本身中使用for循环来创建匹配值的列表。
import pandas as pd
# setup
df1 = pd.DataFrame({'id':[1,2,3,4]})
print(df1)
df2 = pd.DataFrame({
'colA' : [3, 4, 4, 2, 1, 1],
'colB' : [5, 9, 6, 5, 8, 7]
})
print(df2)
#code
df1['colAB'] = df1['id'].apply(lambda row:
[[row, idx] for idx in df2.loc[df2[df2.colA == row].index,'colB']])
print(df1)
df1
id colAB
0 1 [[1, 8], [1, 7]]
1 2 [[2, 5]]
2 3 [[3, 5]]
3 4 [[4, 9], [4, 6]]