我有这样的数据集:
| 订单代码|项目ID|项目名称|总价|
| - ------|- ------|- ------|- ------|
| 一百二十三|识别码1|名称1|三四五|
| 三二一|身份2|名称2|六百七十八|
和函数计算哪些项目一起销售。哪些是最受欢迎或更昂贵的
输出:
| 项目ID|一起出售|
| - ------|- ------|
| 识别码1|[同上33、同上23、同上12]|
| 身份2|[编号56、编号663]|
我使用此功能:
def freq(df):
hit_list = [list of ID's]
result = pd.DataFrame(columns = ['ITEM_ID', 'sold together'])
unic_arc = df['ITEM_ID'].unique()
unic_num = df['ORDER_CODE'].unique()
data_arc ={}
data_num={}
for i in unic_arc:
data_arc[i] = {}
tturns = response_ur[['ITEM_ID', 'TOTALPRICE']].groupby(by = 'ITEM_ID', as_index = False).sum()
tturns = tturns.rename(columns = {'ITEM_ID' : 'inum', 'TOTALPRICE' : 'turn'})
for i in tqdm(unic_arc):
b = df[df['ITEM_ID'] == i]['ORDER_CODE'].values
for t in b:
a = df[df['ORDER_CODE'] == t]['ID'].values
if i in a:
for arc in a:
if int(arc) not in hit_list:
if arc != i:
if arc in data_arc[i]:
data_arc[i][arc]+=1
else:
data_arc[i][arc] = 1
dd = data_arc[i]
tmp = pd.DataFrame(columns = ['inum', 'freq'])
tmp['inum'] = data_arc[i].keys()
tmp['freq'] = data_arc[i].values()
tmp['inum'] = tmp['inum'].astype(str)
tturns['inum'] = tturns['inum'].astype(str)
tmp = pd.merge(tmp, tturns, on = 'inum', how = 'inner')
tmp = tmp.sort_values(by = ['freq', 'turn'], ascending = False)
if len(tmp['inum'].values) > 14:
inums = str(tmp['inum'].values[0:15]).replace("\n", "").replace(' ', ',').replace('\'', '')
else:
inums = str(tmp['inum'].values).replace("\n", "").replace(' ', ',').replace('\'', '')
result = res.append({'inum' : i, 'recs' : inums}, ignore_index = True)
return(result)
我尝试在任何迭代中为Func中的addint ITEM_NAME添加merge 1,但时间太长。我的数据集大约有10kk行
我需要添加到我的输出一列的'ITEM_NAME'的'一起出售'列表项目。和计算它快吗?
UPD:这是我们需要的:
| 项目标识|项目列表|姓名列表|总和|
| - ------|- ------|- ------|- ------|
| 编号_01|[身份,身份,身份,身份]|[姓名,姓名......]|努姆|
其中list_of items-"最常用"项目列表,这些项目是使用"item_id"购买的
1条答案
按热度按时间6jygbczu1#
这可能会做到这一点:
Further good answer how to create a list in a group by aggregation: