私は3列のデータフレームを持っています。 Col 1はストリング注文番号、Col 2は整数日、Col 3は製品名です。 これを行列に変換して、各行が固有の注文/日の組み合わせを表し、各列がその組み合わせの製品名の存在を示す1/0を表す行列に変換したいと考えています。pandasデータフレームから複合キーを使用したスパースキーアイテムマトリックスへの変換
これまでのアプローチでは、製品辞書と、注文番号&日の複合キーを使用した辞書を使用しています。 行列のビットを1にフリップするために元のデータフレームを反復処理する最後のステップはsloooowです。マトリックスの場合、363K×331のサイズと約97%の希薄さの10分のように。
私は考慮すべき別のアプローチがありますか?
例えば、
ord_nb day prod
1 1 A
1 1 B
1 2 B
1 2 C
1 2 D
は私のアプローチは、オーダー/日のペアの辞書を作成することであった
A B C D
1 1 0 0
0 1 1 1
なる:
ord_day_dict = {}
print("Making a dictionary of ord-by-day keys...")
gp = df.groupby(['day', 'ord'])
for i,g in enumerate(gp.groups.items()):
ord_day_dict[g[0][0], g[0][1]] = i
私はインデックスrepresentionを追加元のデータフレーム:
df['ord_day_idx'] = 0 #Create a place holder column
for i, row in df.iterrows(): #populate the column with the index
df.set_value(i,'ord_day_idx',ord_day_dict[(row['day'], row['ord_nb'])])
私はその後、私のORD /日Xユニークな製品のサイズ行列を初期化します。
n_items = df.prod_nm.unique().shape[0] #unique number of products
n_ord_days = len(ord_day_dict) #unique number of ord-by-day combos
df_fac_matrix = np.zeros((n_ord_days, n_items), dtype=np.float64)#-1)
私は辞書を経由してインデックスに文字列から私のプロダクトを変換:
prod_dict = dict()
i = 0
for v in df.prod:
if v not in prod_dict:
prod_dict[v] = i
i = i + 1
そして最後に元のデータフレームを反復して、特定の日の特定の注文に特定の製品が含まれている行列を1に設定します。ここで
for line in df.itertuples():
df_fac_matrix[line[4], line[3]] = 1.0 #in the order-by-day index row and the product index column of our ord/day-by-prod matrix, mark a 1