1. 程式人生 > >【python】生成笛卡爾積(交叉表)DataFrame和numpy

【python】生成笛卡爾積(交叉表)DataFrame和numpy

有檔案A:這裡寫圖片描述,B:這裡寫圖片描述,希望通過A,B生成C:這裡寫圖片描述
就是笛卡爾積操作。
一,當資料在numpy陣列中,資料為:

A=['a','b','c','d']
B=['1','2','3','4']

其實方法一的思想很簡單粗暴:A,B元素儲存在list中,將A中每個元素複製len(B)次,然後將之與B進行行合併;得到的結果再與result列合併。最後輸出result
程式碼如下:

def dikaerji(A,B):
    lenB = len(B)
#     print(lenB)
    dika_num = pd.DataFrame(columns=['alph','num'])
    for
a in A: curA = np.array([a]*lenB) curA.shape = (lenB,1) # 必須要先轉換成np的aray形式,不然會報“沒有shape”的錯 curB = np.array(B) curB.shape = (lenB,1) join_h = np.hstack((curA,curB)) dika_num = dika_num.append(pd.DataFrame(join_h,columns=['alph','num']),ignore_index=True
) return dika_num

結果為:
這裡寫圖片描述

方法二,若資料是在兩個DataFrame中儲存著:

first = DataFrame([['a','b','c','d']],columns=['first'])
second = DataFrame([1,2,3,4],columns=['second'])

思想:迴圈遍歷兩層for迴圈,使用iterrows()函式來獲取行資訊,程式碼如下:

def getMergeAB(A,B):
    newDf = DataFrame(columns=['alpha','nums'])
    for _,A_row in
A.iterrows(): for _,B_row in B.iterrows(): AData=A_row['first'] BData=B_row['second'] row = DataFrame([dict(alpha=AData,nums=BData)]) newDf = newDf.append(row,ignore_index=True) return newDf

測試:

first = DataFrame([['a','x'],['b','y'],['c','z'],['d','w']],columns=['first','x_first'])
second = DataFrame([1,2,3,4],columns=['second'])
da = getMergeAB(first,second)

結果:
這裡寫圖片描述

說明:A.iterrows()函式返回一個(index, Series) pairs,儲存的是這一行的下標值和這一行所有的值