假设我有两个pandas系列,系列A和系列B。如何创建一个数据框,其中所有这些值都相乘,即在左侧放置系列A,在顶部放置系列B。基本上与此概念相同,其中系列A将是左侧的黄色,系列B将是顶部的黄色,并且中间的所有值都将通过乘法填充:
抱歉,可能应该补充说明我的两个序列长度不同。我现在收到一个错误消息,指出“矩阵未对齐”,因此我认为这就是问题所在。假设我有两个pandas系列,系列A和系列B。如何创建一个数据框,其中所有这些值都相乘,即在左侧放置系列A,在顶部放置系列B。基本上与此概念相同,其中系列A将是左侧的黄色,系列B将是顶部的黄色,并且中间的所有值都将通过乘法填充:
抱歉,可能应该补充说明我的两个序列长度不同。我现在收到一个错误消息,指出“矩阵未对齐”,因此我认为这就是问题所在。您可以使用矩阵乘法点积,但在此之前,您需要将Series转换为DataFrame(因为 Series上的dot方法实现了点积):
>>> B = pd.Series(range(1, 5))
>>> A = pd.Series(range(1, 5))
>>> dfA = pd.DataFrame(A)
>>> dfB = pd.DataFrame(B)
>>> dfA.dot(dfB.T)
0 1 2 3
0 1 2 3 4
1 2 4 6 8
2 3 6 9 12
3 4 8 12 16
你可以通过对两个长度不等的Series进行广播,将每行(或列)的每个值与另一个Series相乘来创建一个DataFrame。例如:
> row = pd.Series(np.arange(1, 6), index=np.arange(1, 6))
> col = pd.Series(np.arange(1, 4), index=np.arange(1, 4))
> row.apply(lambda r: r * col)
1 2 3
1 1 2 3
2 2 4 6
3 3 6 9
4 4 8 12
5 5 10 15
首先创建一个由1组成的DataFrame。然后在每个轴上依次进行广播乘法。
>>> s1 = Series([1,2,3,4,5])
>>> s2 = Series([10,20,30])
>>> df = DataFrame(1, index=s1.index, columns=s2.index)
>>> df
0 1 2
0 1 1 1
1 1 1 1
2 1 1 1
3 1 1 1
4 1 1 1
>>>> df.multiply(s1, axis='index') * s2
0 1 2
0 10 20 30
1 20 40 60
2 30 60 90
3 40 80 120
4 50 100 150
您需要使用 df.multiply
来指定系列将与行索引对齐。您可以使用普通乘法运算符 *
,因为在 DataFrame 和 Series 之间进行乘法运算时,默认情况下是在列上匹配。
如果您有两个长度不同的系列,我认为这可能会让您走得更远。这似乎是一个非常手动的过程,但我想不出使用 pandas 或 NumPy 函数的其他方法。
>>>> a = Series([1, 3, 3, 5, 5])
>>>> b = Series([5, 10])
>>>> result = DataFrame(a)
>>>> for i in xrange(len(b)):
result[i] = a
0 1
0 1 1
1 3 3
2 3 3
3 5 5
4 5 5
b
广播到你的数据框 result
:>>>> result = result.mul(b)
0 1
0 5 10
1 15 30
2 15 30
3 25 50
4 25 50
>>>> result.columns = b
>>>> result.set_index(a)
5 10
1 5 10
3 15 30
3 15 30
5 25 50
5 25 50
重复索引的示例:
>>>> result.loc[3]
5 10
3 15 30
3 15 30
>>> a = pd.Series([1, 2, 3, 4])
>>> b = pd.Series([10, 20, 30])
>>> a.to_frame().dot(b.to_frame().transpose())
0 1 2
0 10 20 30
1 20 40 60
2 30 60 90
3 40 80 120
还要确保系列的名称相同。