Pandas:使用包含行权重的另一个数据框值的数据框的逐元素和积
Pandas: Element-wise sum-product of data frame of values using a another data frame containing row weights
希望这不是重复的。我有两个数据框:第一个数据框的大小为 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()
,但我无法使其正常工作。非常感谢这里的任何帮助!
尝试:
# 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])]]
希望这不是重复的。我有两个数据框:第一个数据框的大小为 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()
,但我无法使其正常工作。非常感谢这里的任何帮助!
尝试:
# 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])]]