python - 有没有办法匹配两个数据帧中的序列号,并将 df2 中的系列列表(来自行)添加到 df1 中的新列中(Python,pandas)

标签 python pandas dataframe

作为标题,我希望生成 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.mergegroupbyagg:

让我们分解一下:

  • 我们正在leftdf1df2的分组版本合并,这意味着我们将保留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/

相关文章:

python - 如何获取idmax-admin在时序数据中的分布?

python - 汇总数据框以及 python 中的行数

Python 3.4.3。为什么我的程序在错误输入后不保存我的字典键?

python-3.x - Pandas 移位日期时间索引运行时间太长

python - 如何获取平均每小时的条目数?

python-3.x - 将 df 中的所有列与 Pandas 结合(itertools)

scala - 拆分单行的多个字段或列并使用 Scala 创建多行

python - 如何使用 Bluemix 重复运行 python 应用程序?

python - 公开 C++ 函数,使用 Boost.Python 返回指针

python - PySpark DataFrame 上的 Sum 操作在类型正常时给出 TypeError