作为标题,我希望生成来自df2的所有匹配序列号的列表(或其他dtype),并将它们存储在df1中的一个新列中,这样当我从df1中提取记录(产品)时,我能够找到该产品的所有评论分数。与序列号相匹配。
data1 = { 'serialNumbers' : [1, 2, 3 ,4 ,5],
'product' : ['a', 'b' , 'c', 'd', 'e']}
data2 = { 'reviewScore' : [5, 1, 4, 1, 5, 2, 4, 3, 1, 3, 4],
'serialNumbers' : [1, 1, 1, 1, 3, 4, 4, 2, 3, 3, 4],
'otherData' : ['a', 'b' , 'c', 'd', 'e', 'a', 'b' , 'c', 'd', 'e','a']}
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
df1
serialNumbers product
0 1 a
1 2 b
2 3 c
3 4 d
4 5 e
df2
reviewScore serialNumbers
0 5 1
1 1 1
2 4 1
3 1 1
4 5 3
5 2 4
6 4 4
7 3 2
8 1 3
9 3 3
10 4 4
desired output:
serialNumbers product reviewData
0 1 a [5 : a , 1 : b, 4 : c, 1 : d]
1 2 b [3 : c]
2 3 c [5 : e, 1 : d, 3 : e]
3 4 d [2 : a, 4 : b, 4 : a]
4 5 e []发布于 2021-01-10 10:50:48
您可以使用pd.merge、groupby和agg的组合
让我们详细说明以下几点:
groupby
tolist()的结果附加在d16serialNumber
>函数中,并按每个serialNumber返回所有信息。
res = pd.merge(df1,(df2.groupby('serialNumbers').agg({'reviewScore':lambda x: x.tolist()})).reset_index(),how='left')其中的指纹:
serialNumbers product reviewScore
0 1 a [5, 1, 4, 1]
1 2 b [3]
2 3 c [5, 1, 3]
3 4 d [2, 4, 4]
4 5 e NaN编辑1
考虑到您最新的问题,请尝试如下:
df2['temp'] = df2['reviewScore'].astype(str) + ' : ' + df2['otherData'].astype(str)
res = pd.merge(df1,(df2.groupby('serialNumbers').agg({'temp':lambda x: x.tolist()})).reset_index(),how='left')其中的指纹:
serialNumbers product temp
0 1 a [5 : a, 1 : b, 4 : c, 1 : d]
1 2 b [3 : c]
2 3 c [5 : e, 1 : d, 3 : e]
3 4 d [2 : a, 4 : b, 4 : a]
4 5 e NaN请注意,我不确定这是否是最有效的方法(或最重要的琵琶方式),但我认为它可以得到你所需要的。
编辑2
df2['temp1'] = df2[['reviewScore','otherData']].values.tolist()
res = pd.merge(df1,(df2.groupby('serialNumbers').agg({'temp1':lambda x: x.tolist()})).reset_index(),how='left')
serialNumbers product temp1
0 1 a [[5, a], [1, b], [4, c], [1, d]]
1 2 b [[3, c]]
2 3 c [[5, e], [1, d], [3, e]]
3 4 d [[2, a], [4, b], [4, a]]
4 5 e NaNhttps://stackoverflow.com/questions/65652356
复制相似问题