在Pandas中合并并透视两个数据框,处理逗号分隔字符串列
解决Pandas DataFrame合并、透视及逗号分隔列处理问题
咱们一步步来搞定你这个需求,先补全你给出的代码,再依次处理标签拆分、数据合并和透视操作:
1. 补全数据框定义
你给出的dfB代码没写完,先把它补全:
import pandas as pd import numpy as np # 定义dfA tableA = [(100, 'chocolate, sprinkles'), (101, 'chocolate, sprinkles'), (102, 'glazed')] labels = ['product', 'tags'] dfA = pd.DataFrame.from_records(tableA, columns=labels) # 补全dfB的定义 tableB = [('A', 100), ('A', 101), ('B', 101), ('C', 100), ('C', 102), ('B', 101), ('A', 100), ('C', 102)] labels = ['customer', 'product'] dfB = pd.DataFrame.from_records(tableB, columns=labels)
2. 处理dfA的逗号分隔tags列
dfA里的tags是逗号分隔的字符串,这种格式没法直接和dfB合并后做透视,咱们得把每个标签拆成单独的行:
# 先把tags按逗号+空格拆分,然后展开成多行 dfA_expanded = dfA.assign(tags=dfA['tags'].str.split(', ')).explode('tags')
处理后,每个product对应的每个标签都会单独占一行——比如product 100会生成两行,分别对应chocolate和sprinkles,这样后续合并和透视才能准确关联。
3. 合并两个DataFrame
现在可以用merge方法把处理后的dfA和dfB合并,关联字段是product:
merged_df = pd.merge(dfB, dfA_expanded, on='product', how='left')
这里用how='left'是为了保留dfB里的所有记录,即使某个product在dfA里没有对应标签(你的示例数据里没这种情况,但这么写更通用)。
4. 执行透视操作
假设你想统计每个客户对应每个标签的产品出现次数,可以用pivot_table实现:
pivot_result = merged_df.pivot_table( index='customer', columns='tags', values='product', aggfunc='count', fill_value=0 )
如果你想更简洁,也可以用pd.crosstab,效果完全一致:
pivot_result = pd.crosstab(merged_df['customer'], merged_df['tags'])
最终结果示例
运行完上面的代码,pivot_result会输出如下格式的表格:
| customer | chocolate | glazed | sprinkles |
|---|---|---|---|
| A | 3 | 0 | 3 |
| B | 2 | 0 | 2 |
| C | 1 | 2 | 1 |
这样就完成了从标签拆分、数据合并到透视表生成的全流程操作。
内容的提问来源于stack exchange,提问作者Jeff Tehrani
相关产品推荐
相关产品推荐

