【问题标题】:Pandas: Element-wise sum-product of data frame of values using a another data frame containing row weightsPandas:使用另一个包含行权重的数据框的数据框的元素和乘积
【发布时间】:2021-12-12 20:30:36
【问题描述】:

希望这不是重复的。我有两个数据框:第一个数据框的大小为 n x m,每个单元格包含大小为 k 的数值列表。第二个数据框的大小为 n x k,每个单元格包含一个数值(本质上是一个权重)。我需要做的是找到一种有效的方法来执行以下操作:对于第一个数据帧中的每个单元格,将该单元格中的值列表乘以第二个数据帧中的一系列值对应于同一行。然后,将所有产品相加。

这是一个简单的例子: df1 的大小为 2x3,每个单元格包含 3 个值的列表。 df2 的大小为 2x3,每个单元格包含一个值。

In [3]: df1
Out[3]:
           x          y          z
0  [1, 2, 3]  [2, 3, 4]  [3, 4, 5]
1  [4, 5, 6]  [5, 6, 7]  [6, 7, 8]

In [5]: df2
Out[5]:
   first  second  third
0      1       1      1
1      2       2      2

df1 中的列表乘以df2 中的相应行系列后的中间结果是:

           x          y          z
0  [1, 2, 3]  [2, 3, 4]  [3, 4, 5]
1  [8, 10, 12]  [10, 12, 14]  [12, 14, 16]

最后的结果应该是:

           x          y          z
0          6          9         12
1         30         36         42

现在我只是使用嵌套的 for 循环,它可以工作但效率极低(当然)。我尝试使用itertuples(),但我无法让它正常工作。非常感谢这里的任何帮助!

【问题讨论】:

  • 不要将数据存储为列表。在这种情况下,您的数据是 3-D,您可以做 2 级索引(0,x), ... 和单级列0,1,2。那么乘法和加法就很简单了。
  • 嗯,这是一个有趣的方法。你知道是否有一种简单的方法可以将列表转换为 Pandas 中的“第三维”?
  • df.stack().explode().
  • 什么是“数值列表”? python 列表还是 numpy 数组?
  • @QuangHoang,使用您的方法,我会执行以下操作:(df1.stack().explode()*df2.stack()).reset_index().pivot_table(values=0,index='level_0',columns='level_1',aggfunc=sum).reset_index(drop=True).rename_axis(None, axis=1) 它确实有效,我确信它比嵌套 for 循环更有效。但是,我认为@Corralien 接受的答案更好。不过,感谢您的帮助!

标签: python-3.x pandas dataframe sumproduct elementwise-operations


【解决方案1】:

试试:

# Convert each list to numpy array if it's not already the case
df1 = df1.applymap(np.array)

vals = np.sum((df1.values * df2.values), axis=1)
out = pd.DataFrame.from_records(vals, index=df1.index, columns=df1.columns)

输出:

>>> out
    x   y   z
0   6   9  12
1  30  36  42

# Intermediate result
>>> df1.values * df2.values
 [[array([1, 2, 3]) array([2, 3, 4]) array([3, 4, 5])]
 [array([ 8, 10, 12]) array([10, 12, 14]) array([12, 14, 16])]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-21
    • 2021-01-11
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 2018-03-28
    • 1970-01-01
    相关资源
    最近更新 更多