如何合并DataFrame中同月份日期列并以逗号拼接对应值
实现DataFrame按月份合并日期列并拼接价格值
没问题,这个需求很好实现!你已经找对了方向——用groupby来按月份分组,只要把求和换成自定义的字符串拼接逻辑就行。我给你两种直观的实现方案,都能得到你想要的输出:
方法一:用melt+pivot实现长格式转宽格式
这种方法逻辑清晰,适合新手理解:
- 先把宽格式的数据转成长格式(melt),方便按产品和月份分组
- 分组后用字符串拼接合并价格
- 再转回宽格式(pivot)得到最终结果
import pandas as pd # 示例输入数据(和你的需求一致) data = pd.DataFrame({ 'product': ['A', 'B'], '05-Oct-2020': [66.2, 368.7], '07-Oct-2020': [69.5, 382.8], '09-Nov-2020': [72.95, 384.7], '13-Nov-2020': [76.55, 386.8] }) # 1. 转换为长格式:把日期列拆成"月份年份"和"价格"两列 melted_data = data.melt( id_vars='product', # 保留product作为标识列 var_name='month_year', # 原日期列名重命名为月份年份 value_name='price' # 价格列的名称 ) # 2. 解析月份年份格式(确保统一),然后分组拼接价格 melted_data['month_year'] = pd.to_datetime( melted_data['month_year'], format="%d-%b-%Y" ).strftime("%b-%Y") # 分组后,把每个组的价格转成字符串,用", "拼接 grouped = melted_data.groupby(['product', 'month_year'])['price'].apply( lambda x: ', '.join(map(str, x)) ).unstack() # 把月份年份转成列 # 3. 重置索引,让product回到列的位置 final_result = grouped.reset_index() print(final_result)
方法二:按你的思路用转置+groupby实现
如果你更倾向于用转置后分组的方式,也可以这样写:
import pandas as pd # 示例数据同上 data = pd.DataFrame({ 'product': ['A', 'B'], '05-Oct-2020': [66.2, 368.7], '07-Oct-2020': [69.5, 382.8], '09-Nov-2020': [72.95, 384.7], '13-Nov-2020': [76.55, 386.8] }) # 1. 设置product为索引,然后转置数据 transposed = data.set_index('product').T # 2. 把转置后的索引(原日期列名)转换为月份年份格式 transposed.index = pd.to_datetime( transposed.index, format="%d-%b-%Y" ).strftime("%b-%Y") # 3. 按月份年份分组,拼接价格字符串 grouped = transposed.groupby(level=0).agg( lambda x: ', '.join(map(str, x)) ) # 4. 再次转置回来,重置索引得到最终结果 final_result = grouped.T.reset_index() print(final_result)
关键说明
- 为什么用
lambda x: ', '.join(map(str, x))?
groupby后的sum()是数值求和,而我们需要把每个组里的价格值转成字符串,再用逗号加空格连接起来。map(str, x)把每个float类型的价格转成字符串,', '.join()负责拼接。 - 用
pd.to_datetime比手动strptime更稳妥:它能自动处理大部分日期格式,而且出错时会给出清晰的提示。
两种方法运行后都会得到你期望的输出:
| product | Oct-2020 | Nov-2020 |
|---|---|---|
| A | 66.2, 69.5 | 72.95, 76.55 |
| B | 368.7, 382.8 | 384.7, 386.8 |
内容的提问来源于stack exchange,提问作者Pritam Ughade
相关产品推荐
相关产品推荐

