首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >市场篮子分析

市场篮子分析
EN

Stack Overflow用户
提问于 2018-02-18 12:44:21
回答 2查看 543关注 0票数 3

我有以下熊猫交易数据,关于一家零售店:

代码语言:javascript
复制
print(df)

product       Date                   Assistant_name
product_1     2017-01-02 11:45:00    John
product_2     2017-01-02 11:45:00    John
product_3     2017-01-02 11:55:00    Mark
...

我希望为市场篮子分析创建以下dataset:

代码语言:javascript
复制
product       Date                   Assistant_name  Invoice_number
product_1     2017-01-02 11:45:00    John            1
product_2     2017-01-02 11:45:00    John            1
product_3     2017-01-02 11:55:00    Mark            2
    ...

简单地说,如果一个事务具有相同的 Assistant_name和Date,那么我假设它确实生成了一个新的发票。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-18 13:13:37

最简单的是将列连接在一起的factorize

代码语言:javascript
复制
df['Invoice'] = pd.factorize(df['Date'].astype(str) + df['Assistant_name'])[0] + 1
print (df)
     product                 Date Assistant_name  Invoice
0  product_1  2017-01-02 11:45:00           John        1
1  product_2  2017-01-02 11:45:00           John        1
2  product_3  2017-01-02 11:55:00           Mark        2

如果性能很重要,请使用pd.lib.fast_zip

代码语言:javascript
复制
df['Invoice']=pd.factorize(pd.lib.fast_zip([df.Date.values, df.Assistant_name.values]))[0]+1

时间

代码语言:javascript
复制
#[30000 rows x 3 columns]
df = pd.concat([df] * 10000, ignore_index=True)

In [178]: %%timeit
     ...: df['Invoice'] = list(zip(df['Date'], df['Assistant_name']))
     ...: df['Invoice'] = df['Invoice'].astype('category').cat.codes + 1
     ...: 
9.16 ms ± 54.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [179]: %%timeit
     ...: df['Invoice'] = pd.factorize(df['Date'].astype(str) + df['Assistant_name'])[0] + 1
     ...: 
11.2 ms ± 395 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [180]: %%timeit 
     ...: df['Invoice'] = pd.factorize(pd.lib.fast_zip([df.Date.values, df.Assistant_name.values]))[0] + 1
     ...: 
6.27 ms ± 93.6 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
票数 4
EN

Stack Overflow用户

发布于 2018-02-18 12:51:45

使用pandas类别是一种方法:

代码语言:javascript
复制
df['Invoice'] = list(zip(df['Date'], df['Assistant_name']))
df['Invoice'] = df['Invoice'].astype('category').cat.codes + 1

#               product      Date Assistant_name  Invoice
# product_1  2017-01-02  11:45:00           John        1
# product_2  2017-01-02  11:45:00           John        1
# product_3  2017-01-02  11:55:00           Mark        2

此方法的优点是可以轻松检索映射字典:

代码语言:javascript
复制
dict(enumerate(df['Invoice'].astype('category').cat.categories, 1))
# {1: ('11:45:00', 'John'), 2: ('11:55:00', 'Mark')}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48851820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档