2013-10-24 9 views
5

假設我在熊貓系列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

對不起,應該可能補充說我的兩個系列的長度不一樣。我現在遇到'矩陣不對齊'的錯誤,所以我認爲這是問題所在。

+0

您到目前爲止嘗試過什麼?您可以編輯您的問題並添加一些代碼和錯誤或結果。 – Theresa

回答

2

可以使用矩陣乘法點,但你必須之前系列轉換成數據幀(因爲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 
0

所以我覺得這可能讓你大多數的方式存在,如果你有兩個系列不同的長度。這似乎是一個非常手動的過程,但我想不出用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 = 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

首先創建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一起使用,因爲列上的匹配是在DataFrame和Series之間進行乘法的默認方式。

2

您可以通過將行(或列)的每個值與其他系列廣播來乘以兩個不等長度系列來創建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 
相關問題