如何从现有的数据框创建一个新的数据框?

3

I have the following 2 dataframes:

df1

product_ID         tags
100         chocolate, sprinkles
101         chocolate, filled
102         glazed

df2

customer   product_ID
A            100
A            101
B            101
C            100
C            102
B            101
A            100
C            102

我应该能够像这样创建一个新的数据框架。
| customer | chocolate | sprinkles | filled | glazed |
|----------|-----------|-----------|--------|--------|
| A        | ?         | ?         | ?      | ?      |
| B        | ?         | ?         | ?      | ?      |
| C        | ?         | ?         | ?      | ?      |

单元格的内容表示产品属性出现次数。

我使用了merge,得到了以下结果

df3 = pd.merge(df2, df1)
df3.drop(['product'], axis = 1)

customer       tags
A        chocolate, sprinkles
C        chocolate, sprinkles
A        chocolate, sprinkles
A        chocolate, filled
B        chocolate, filled
B        chocolate, filled
C        glazed
C        glazed

我们如何从这里到达最终结果? 提前致谢!

2个回答

3

使用get_dummies

df.set_index('customer').tags.str.get_dummies(sep=',').sum(level=0)
Out[593]: 
          chocolate  filled  glazed  sprinkles
customer                                      
A                 3       1       0          2
C                 1       0       2          1
B                 2       2       0          0

2
您可以通过以下两个步骤完成此操作:
  1. 使用一系列逗号分隔的字符串来扩展/压缩您的数据框。
  2. 使用 pandas.crosstab 来制表计算您的计数。
假设您已经执行了合并操作,并且结果为 df,以下是一个示例:
import numpy as np
from itertools import chain

# split by comma to form series of lists
tag_split = df['tags'].str.split(',')

# create expanded dataframe
df_full = pd.DataFrame({'customer': np.repeat(df['customer'], tag_split.map(len)),
                        'tags': list(chain.from_iterable(tag_split))})

# use pd.crosstab for result
res = pd.crosstab(df_full['customer'], df_full['tags'])

print(res)

tags       filled   sprinkles  chocolate  glazed
customer                                        
A               1           2          3       0
B               2           0          2       0
C               0           1          1       2

运行非常顺利!您能解释一下在“#创建扩展数据框”部分所编写的代码吗? - uharsha33
当然,np.repeat(df ['customer'],tag_split.map(len)) 通过标签的长度重复 customer 列中的每个值。list(chain.from_iterable(tag_split)) 创建所有逗号分隔元素的单个列表。您可以阅读 np.repeatitertools.chain.from_iterable 的文档。 - jpp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接