Python 通过将两个系列相乘在一起在pandas中创建数据帧

Python 通过将两个系列相乘在一起在pandas中创建数据帧,python,pandas,dataframe,series,Python,Pandas,Dataframe,Series,假设我有两个熊猫系列,A系列和B系列。我如何创建一个数据帧,其中所有这些值都相乘在一起,即A系列位于左侧,B系列位于顶部。基本上与此相同的概念,其中A系列为左侧的黄色,B系列为顶部的黄色,中间的所有值将通过乘法填充: 对不起,我应该补充一点,我的两个系列的长度不一样。现在我遇到了一个错误,即“矩阵未对齐”,因此我假设这就是问题所在。您可以使用矩阵乘法点,但在您必须将序列转换为数据帧之前(因为): 所以我认为,如果你有两个不同长度的序列,这可能会让你得到大部分的方法。这似乎是一个非常手动的过程,

假设我有两个熊猫系列,A系列和B系列。我如何创建一个数据帧,其中所有这些值都相乘在一起,即A系列位于左侧,B系列位于顶部。基本上与此相同的概念,其中A系列为左侧的黄色,B系列为顶部的黄色,中间的所有值将通过乘法填充:


对不起,我应该补充一点,我的两个系列的长度不一样。现在我遇到了一个错误,即“矩阵未对齐”,因此我假设这就是问题所在。

您可以使用矩阵乘法点,但在您必须将序列转换为数据帧之前(因为):


所以我认为,如果你有两个不同长度的序列,这可能会让你得到大部分的方法。这似乎是一个非常手动的过程,但我想不出使用pandas或NumPy函数的其他方法

>>>> a = Series([1, 3, 3, 5, 5])
>>>> b = Series([5, 10])
首先将行值
a
转换为数据帧,并以新列的形式复制此系列,只要列系列
b
中有值即可

>>>> 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.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

首先创建一个1的数据帧。然后依次沿每个轴进行乘法广播

>>> 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
来指定序列将与行索引对齐。您可以将普通乘法运算符
*
用于s2,因为列上的匹配是在数据帧和序列之间进行乘法的默认方式。

您可以通过将行(或列)的每个值与其他序列广播,将两个长度不等的序列相乘来创建数据帧。例如:

> 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

到目前为止你试过什么?您可以编辑问题并添加一些代码、错误或结果。
> 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