我过滤掉重复项,在同一行上得到重复项,并用逗号连接项目,并使用下面的这段代码,真的不理解为什么要复制Join_Dup
列吗?
dd = sales_all[sales_all['Order ID'].duplicated(keep=False)]
dd['Join_Dup'] = dd.groupby('Order ID')['Product'].transform(lambda x: ','.join(x))
print(dd.head())
dd = dd[['Order ID','Join_Dup']].drop_duplicates()
dd
Order ID Join_Dup
0 176558 USB-C Charging Cable,USB-C Charging Cable,USB-...
2 176559 Bose SoundSport Headphones,Bose SoundSport Hea...
3 176560 Google Phone,Wired Headphones,Google Phone,Wir...
5 176561 Wired Headphones,Wired Headphones,Wired Headph...
... ... ...
186846 259354 iPhone,iPhone,iPhone,iPhone,iPhone,iPhone
186847 259355 iPhone,iPhone,iPhone,iPhone,iPhone,iPhone
186848 259356 34in Ultrawide Monitor,34in Ultrawide Monitor,...
186849 259357 USB-C Charging Cable,USB-C Charging Cable,USB-...
[178437 rows x 2 columns]
我需要从每行的单元格中删除重复项,请提供一些帮助。
答案 0 :(得分:0)
编辑忽略答案的第二部分。如果最终没有用,我将删除该部分。
因此,您注释每个订单ID都需要唯一的产品字符串。您可以一步一步得到它:
dd = (
sales_all.groupby(['Order ID', 'Product'])['some_other_column']
.size().rename('quantity').reset_index()
)
现在,您具有OrderID /产品的唯一行,其中包含重复产品(或数量,如常规发票)的数量。您可以使用它,也可以分组依据来形成产品列表:
orders = dd.groupby('Order ID').Product.apply(list)
---应用与转换---
请注意,如果按照问题中的说明使用.transform
,则结果将始终具有与要分组的数据框/系列相同的形状(即,分组将相反,并且最终得到相同的数字)行,从而创建重复项)。函数.apply
会将您的groupby组传递给相同的函数(任何函数),但不会广播回原始形状(每个组仅返回一行)。
因此,您要删除出现在多行中的所有Oder ID
(如果ID 14出现在两行中,则将丢弃这两行)。这样会使下一行的groupby变得多余,因为每个分组的ID都只有一行。
好吧,现在已经解决了。然后,假设Product
中的每一行都包含一个要与lambda连接的列表。使用pandas本机功能,此步骤会更快一些。
dd['Join_Dup'] = dd.Product.str.join(', ')
# perhaps choose a better name for the column, once you remove duplicates it will not mean much (does 'Join_Products' work?)
现在可以处理重复项。如果您要删除的是公仔,则实际上并不需要参加最后一步。熊猫也可以处理列表。但是您缺少的部分是subset
属性。
dd = dd[['Order ID', 'Join_Dup']].drop_duplicates(subset='Join_Dup')
答案 1 :(得分:0)
IIUC,让我们尝试防止groupby transform语句中出现重复项:
dd['Join_No_Dup'] = dd.groupby('Order ID')['Product'].transform(lambda x: ','.join(set(x)))