如何将Dataframe中数组类型的ShoppingMonths列转为逗号分隔字符串
解决方案
1. 转换现有DataFrame的numpy数组列
你的ShoppingMonths列是numpy数组类型,只需用apply将每个数组转为逗号分隔的字符串即可:
import pandas as pd import numpy as np # 示例现有DataFrame df = pd.DataFrame({ 'Customer': ['Jane', 'Rob'], 'ShoppingMonths': [np.array([1,2]), np.array([0,12])] }) # 转换为目标格式 df['ShoppingMonths'] = df['ShoppingMonths'].apply(lambda x: ', '.join(map(str, x)))
执行后df就会变成你想要的结构:
| Customer | ShoppingMonths |
|---|---|
| Jane | 1, 2 |
| Rob | 0, 12 |
2. 优化ShoppingMonths列的创建逻辑
你当前用iterrows循环创建numpy数组的方式效率较低,且没必要转成numpy数组。可以直接生成逗号分隔的字符串,避免后续转换步骤:
假设你的原始数据包含JanShop、FebShop...等标识月份购物的列,可按以下方式生成目标列:
# 定义月份列与对应数字的映射(根据你的实际列名调整) month_col_map = { 'JanShop': 1, 'FebShop': 2, 'MarShop': 3, 'AprShop': 4, 'MayShop': 5, 'JunShop': 6, 'JulShop': 7, 'AugShop': 8, 'SepShop': 9, 'OctShop': 10, 'NovShop': 11, 'DecShop': 12 } # 生成ShoppingMonths列 df['ShoppingMonths'] = df.apply( lambda row: ', '.join( str(month_num) for col, month_num in month_col_map.items() if row[col] == 1 ), axis=1 ) # 如果需要包含0的情况(比如Rob的0),可在逻辑中补充对应判断 # 示例:假设存在'NoShop'列,值为1时添加0 # df['ShoppingMonths'] = df.apply( # lambda row: ', '.join( # str(month_num) for col, month_num in month_col_map.items() if row[col] == 1 # ) + (', 0' if row['NoShop'] == 1 else ''), # axis=1 # )
为什么之前的方法无效?
explode方法是将数组/列表拆分为多行,而非合并为字符串,不符合你的需求;- 单纯更改数据类型只是改变存储类型,不会将数组元素转为逗号分隔的文本格式。
内容的提问来源于stack exchange,提问作者milo204
相关产品推荐
相关产品推荐

