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

2024-10-01 09:32:09 发布

您现在位置:Python中文网/ 问答频道 /正文

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

http://www.google.co.uk/imgres?imgurl=http://www.vaughns-1-pagers.com/computer/multiplication-tables/times-table-12x12.gif&imgrefurl=http://www.vaughns-1-pagers.com/computer/multiplication-tables.htm&h=533&w=720&sz=58&tbnid=9B8R_kpUloA4NM:&tbnh=90&tbnw=122&zoom=1&usg=__meqZT9kIAMJ5b8BenRzF0l-CUqY=&docid=j9BT8tUCNtg--M&sa=X&ei=bkBpUpOWOI2p0AWYnIHwBQ&ved=0CE0Q9QEwBg

对不起,应该加上我的两个系列长度不一样。我现在得到一个错误,就是“矩阵不对齐”,所以我想这就是问题所在。在


Tags: 数据comhttp概念pandastableswwwgoogle
3条回答

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

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

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

> 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

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

>>>> a = Series([1, 3, 3, 5, 5])
>>>> b = Series([5, 10])

将列的作为列的第一个列的副本。在

^{pr2}$

然后,您可以在数据帧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

相关问题 更多 >