作为标题,我希望生成 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 []
最佳答案
您可以结合使用 pd.merge
、groupby
和 agg
:
让我们分解一下:
- 我们正在
left
将df1与df2的分组版本合并,这意味着我们将保留df1的所有信息strong>,并将groupby
的结果附加到其上 agg
函数中的tolist()
返回每个 serialNumber 的所有 reviewScore
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
请注意,我不确定这是获得此信息的最有效方法(或最Pythonic方法),但我认为它可以满足您的需求。
编辑 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 NaN
关于python - 有没有办法匹配两个数据帧中的序列号,并将 df2 中的系列列表(来自行)添加到 df1 中的新列中(Python,pandas),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65652356/