如何在Pandas DataFrame中根据索引重置添加月份字段
问题
现有如下Pandas DataFrame:
import pandas as pd df = pd.DataFrame({'index': [1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6], 'data': [1.5, 0.22, 0.323, 4.4, 5.62, 0.56, 1.32, 2.1, 3.09, 4, 5.3, 0.6]})
需求:当index列的值重新从1开始计数时,为对应的数据组分配指定月份;月份分配无固定规律,已准备好目标月份列表months = ["April", "June"],期望得到如下带Month字段的DataFrame:
df = pd.DataFrame({'index': [1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6], 'data': [1.5, 0.22, 0.323, 4.4, 5.62, 0.56, 1.32, 2.1, 3.09, 4, 5.3, 0.6], 'Month': ['April', 'April', 'April', 'April', 'April', 'April', 'June', 'June', 'June', 'June', 'June', 'June'] })
解决方案
通过识别index列中值为1的位置划分数据组,再将月份列表映射到对应组即可实现需求,具体步骤如下:
- 生成组编号:利用
index == 1生成布尔序列,通过cumsum()累计求和得到每个数据组的编号,调整编号从0开始以匹配月份列表的索引 - 映射月份:将组编号与月份列表对应,为每组数据分配对应月份
完整代码:
import pandas as pd # 原数据 df = pd.DataFrame({'index': [1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6], 'data': [1.5, 0.22, 0.323, 4.4, 5.62, 0.56, 1.32, 2.1, 3.09, 4, 5.3, 0.6]}) months = ["April", "June"] # 生成组编号 df['group_id'] = (df['index'] == 1).cumsum() - 1 # 映射月份 df['Month'] = df['group_id'].map(lambda x: months[x]) # 移除临时组编号列 df = df.drop('group_id', axis=1) print(df)
运行后即可得到目标格式的DataFrame,核心逻辑是通过index == 1的累计和区分不同数据块,每次出现1就代表新组开始,累计和递增后刚好对应月份列表的索引位置。
内容的提问来源于stack exchange,提问作者Lisa
相关产品推荐
相关产品推荐

