基于Pandas Dataframe单列字符串为新列赋值的问题求助
我来帮你搞定这个Pandas数据处理的问题,咱们一步步来实现你的需求,避免你之前遇到的损坏DataFrame或者生成大量空列的问题:
解决方案步骤
1. 先还原你的原始DataFrame
首先我们把你提供的原始数据转换成可操作的Pandas DataFrame:
import pandas as pd # 模拟你拉取到的原始数据 data = { 'language': ['English', 'Spanish', 'Spanish'], 'open-days': ['24/7', 'Mo-Fr', 'Sa-Su'], 'open-time': [None, '07:00', '08:00'], 'close-time': [None, '17:00', '15:00'], 'dept': ['Sales', 'Sales', 'Sales'] } df = pd.DataFrame(data)
2. 定义日期映射并初始化新列
先把网页里的日期缩写(比如Mo)和我们要生成的列名前缀(比如mon)做个映射,然后一次性创建所有需要的新列,默认赋值为0——这刚好满足你对24/7行的赋值要求:
# 日期缩写映射:网页显示的缩写 -> 新列名前缀 day_mapping = { 'Mo': 'mon', 'Tu': 'tue', 'We': 'wed', 'Th': 'thu', 'Fr': 'fri', 'Sa': 'sat', 'Su': 'sun' } # 提取所有需要用到的日期前缀 days = list(day_mapping.values()) # 为每一天创建对应的open和closed列,默认值设为0 for day in days: df[f'{day}-open'] = 0 df[f'{day}-closed'] = 0
3. 编写函数填充对应时段的时间
接下来写一个自定义函数,专门处理每一行数据:如果是24/7就保持默认的0;如果是指定日期范围,就把对应的开闭店时间精准填充到该范围的日期列中:
def fill_daily_hours(row): # 24/7的行直接返回,已经是0了 if row['open-days'] == '24/7': return row # 拆分日期范围(比如把Mo-Fr拆成Mo和Fr) start_day_abbr, end_day_abbr = row['open-days'].split('-') # 转换成列名对应的前缀 start_day = day_mapping[start_day_abbr] end_day = day_mapping[end_day_abbr] # 获取日期在列表中的索引,确定要填充的日期范围 start_idx = days.index(start_day) end_idx = days.index(end_day) # 遍历该范围内的所有日期,填充对应的开闭店时间 for day in days[start_idx:end_idx+1]: row[f'{day}-open'] = row['open-time'] row[f'{day}-closed'] = row['close-time'] return row # 把函数应用到DataFrame的每一行 df = df.apply(fill_daily_hours, axis=1)
4. 查看最终结果
执行完上面的代码后,你就能得到符合预期的DataFrame了(这里只展示部分列,完整结果会包含一周七天的所有对应列):
language open-days open-time close-time dept mon-open mon-closed tue-open tue-closed ... 0 English 24/7 None None Sales 0 0 0 0 ... 1 Spanish Mo-Fr 07:00 17:00 Sales 07:00 17:00 07:00 17:00 ... 2 Spanish Sa-Su 08:00 15:00 Sales 0 0 0 0 ...
这个方法完美覆盖了你的三个需求:
- 为一周每一天都添加了对应的
open和closed列 24/7的行所有新列都自动赋值为0- 指定时段的日期列精准填充了对应的开闭店时间
而且全程都是基于原DataFrame操作,不会生成多余空列,也不会破坏原有数据结构。
内容的提问来源于stack exchange,提问作者thompn
相关产品推荐
相关产品推荐

