在我的数据框中,我有一个字段,该字段显示超时订购的产品的状态。可以是“新建”,“已取消”,“已填充”或“部分”。我总结了记录的每个Order(Orderid)的模式,并对可能发生的不同模式进行了计数。但是,这导致了超过1385种不同的模式。现在,我想将这些模式压缩到箱中,例如,如果订单状态为:“新建”,“新建”,“已取消”,“新建”,“已填充”,则将压缩为:“新建”,“已取消”,“新建”,“已填充”。
这将与以下格式放在同一容器中:新建,新建,新建,已取消,已取消,新建,新建,已填充。
原始数据如下所示:
按每个OrderID分组一次:
为了查看数据中存在的OrderStatus模式,应用了以下代码:
def status_transition_with_timestamp(each_grouped_df):
sorted_df = each_grouped_df.sort_values('timestamp', ascending=True)
concatenated_transition = ','.join(sorted_df['ostatus'])
return concatenated_transition
result = df_grouped['ostatus'].agg(status_transition_with_timestamp)
result.groupby('ostatus').count()
答案 0 :(得分:0)
要删除连续的重复项,请使用itertools.groupby:
from itertools import groupby
df['ostatus'] = df['ostatus'].apply(lambda x: ','.join([x for x, _ in groupby(x.split(','))]))
然后您将拥有唯一的序列,并且可以执行聚合。
示例:
df = pd.DataFrame({'Status': ['New,New,Cancelled', 'New,Cancelled', 'Cancelled,New,Cancelled,New']})
df
# Status
#0 New,New,Cancelled
#1 New,Cancelled
#2 Cancelled,New,Cancelled,New
df['Status'] = df['Status'].apply(lambda x: ','.join([x for x, _ in groupby(x.split(','))]))
df
# Status
#0 New,Cancelled
#1 New,Cancelled
#2 Cancelled,New,Cancelled,New