我正在 SQL 服务器上处理一个巨大的非规范化表。以此作为数据示例:
import pandas as pd
import numpy as np
data = pd.DataFrame({
'status' : ['pending', 'pending','pending', 'canceled','canceled','canceled', 'confirmed', 'confirmed','confirmed'],
'clientId' : ['A', 'B', 'C', 'A', 'D', 'C', 'A', 'B','C'],
'partner' : ['A', np.nan,'C', 'A',np.nan,'C', 'A', np.nan,'C'],
'product' : ['afiliates', 'pre-paid', 'giftcard','afiliates', 'pre-paid', 'giftcard','afiliates', 'pre-paid', 'giftcard'],
'brand' : ['brand_1', 'brand_2', 'brand_3','brand_1', 'brand_2', 'brand_3','brand_1', 'brand_3', 'brand_3'],
'gmv' : [100,100,100,100,100,100,100,100,100]})
data = data.astype({'partner':'category','status':'category','product':'category', 'brand':'category'})
如您所见,其中许多列都是可以因式分解的类别/字符串(用一个小 int 标识替换为另一个 x.1 连接)。
我的问题是是否有一种简单的方法可以从每个类别列中提取另一个“数据帧”并工厂化主表,因此通过单个查询传输的字节可能会更快!有没有简单的库?
我希望得到输出 a :
data = pd.DataFrame({
'status' : ['1', '1','1', '2','2','2', '3', '3','3'],
'clientId' : ['1', '2', '3', '1', '4', '3', '1', '2','3'],
'partner' : ['A', np.nan,'C', 'A',np.nan,'C', 'A', np.nan,'C'],
'product' : ['afiliates', 'pre-paid', 'giftcard','afiliates', 'pre-paid', 'giftcard','afiliates', 'pre-paid', 'giftcard'],
'brand' : ['brand_1', 'brand_2', 'brand_3','brand_1', 'brand_2', 'brand_3','brand_1', 'brand_3', 'brand_3'],
'gmv' : [100,100,100,100,100,100,100,100,100]})
status_df = {1 : 'pending', 2:'canceled', 3:'confirmed'}
clientid = {1 : 'A', 2:'B', 3:'C', 4:'D'}
等等!
奖金问题!我的桌子很大,所以我可能需要使用 DASK 应用一些东西。
factorize
来执行此操作。例如:
codes, uniques = pd.factorize(data['status'])
data['status'] = codes
status_df = pd.DataFrame(uniques)
输出(数据):
status clientId partner product brand gmv
0 0 A A afiliates brand_1 100
1 0 B NaN pre-paid brand_2 100
2 0 C C giftcard brand_3 100
3 1 A A afiliates brand_1 100
4 1 D NaN pre-paid brand_2 100
5 1 C C giftcard brand_3 100
6 2 A A afiliates brand_1 100
7 2 B NaN pre-paid brand_3 100
8 2 C C giftcard brand_3 100
输出(status_df):
0
0 pending
1 canceled
2 confirmed