如何在Pandas DataFrame中按周将周一Open值复制到当周其他单元格?
解决方法
你可以通过按周分组的方式,把每周周一的Open值提取出来后自动填充到当周所有行,下面是两种实用的实现方式:
方法一:groupby + transform 直接生成
这种方法一步到位,无需额外中间表:
- 先确保日期列是datetime格式(如果还没转换的话):
import pandas as pd df['date'] = pd.to_datetime(df['date'])
- 给每行标记对应ISO标准周数(每年周数范围1-53):
df['week_num'] = df['date'].dt.isocalendar().week
- 分组后提取周一的Open值并广播到整周:
df['Expected_Open'] = df.groupby('week_num')['open'].transform( lambda x: x[x.index.map(lambda i: df.loc[i, 'Weekday'] == 'Monday')].iloc[0] )
或者用更易读的自定义函数写法:
def get_weekly_monday_open(group): # 从分组中筛选周一的Open值,取第一个(确保每周仅一条周一数据) monday_open_val = group[group['Weekday'] == 'Monday']['open'].iloc[0] # 返回和分组行数一致的数组,填充该值 return [monday_open_val] * len(group) df['Expected_Open'] = df.groupby('week_num').apply(get_weekly_monday_open).explode()
方法二:提取周一数据后合并
这种方式逻辑更直观,适合新手理解:
- 同样先处理日期和周数:
df['date'] = pd.to_datetime(df['date']) df['week_num'] = df['date'].dt.isocalendar().week
- 单独提取每周周一的Open值,并重命名目标列:
# 筛选周一的行,仅保留周数和Open列 monday_open_data = df[df['Weekday'] == 'Monday'][['week_num', 'open']].rename(columns={'open': 'Expected_Open'})
- 按周数合并原表和周一数据,自动填充整周:
df = df.merge(monday_open_data, on='week_num', how='left')
注意事项
- 如果数据中存在某周无周一数据的情况,上述方法会生成
NaN,你可以根据需求用fillna()处理,比如填充前一周的周一值或其他默认值。 - 若需按自然年周数统计(而非ISO标准),可将周数生成代码改为
df['week_num'] = df['date'].dt.strftime('%W')(%W以周一为一周起始)。
内容的提问来源于stack exchange,提问作者user21901923
相关产品推荐
相关产品推荐

