2024-10-01 09:32:09 发布
网友
假设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
对不起,应该加上我的两个系列长度不一样。我现在得到一个错误,就是“矩阵不对齐”,所以我想这就是问题所在。在
您可以使用矩阵乘法点,但在必须将序列转换为数据帧之前(因为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])
将列的作为列的第一个列的副本。在
然后,您可以在数据帧b上广播您的系列result:
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
您可以使用矩阵乘法点,但在必须将序列转换为数据帧之前(因为dot method on Series implements dot product):
通过将行(或列)的每个值与另一系列广播,可以通过将两个长度不等的序列相乘来创建数据帧。例如:
所以我认为如果你有两个不同长度的序列,这可能会让你达到最大的效果。这似乎是一个非常手动的过程,但我想不出另一种方法来使用pandas或NumPy函数。在
将列的作为列的第一个列的副本。在
^{pr2}$然后,您可以在数据帧
b
上广播您的系列result
:在我选择的示例中,由于初始序列的缘故,您将得到重复的索引。我建议将索引保留为唯一标识符。这在编程上是有意义的,否则当您选择一个分配了多行的索引时,您将返回多个值。如果必须,可以使用以下函数重新索引行标签和列标签:
重复索引示例:
相关问题 更多 >
编程相关推荐