You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用pandas按指定规则将数据框中水果分配到对应日期的实现方案

基于pandas的7天水果自动分配实现

需求规则

核心分配规则

  • 规则1:apple不可连续发放,两个apple的发放间隔至少为1天
  • 规则2:orange必须在第7天(最后一天)发放
  • 规则3:第6天不可发放lemon,且lemon与orange的发放间隔至少为1天
  • 规则4:lemon和orange的发放日不可搭配其他水果;若总水果数超过7,多余水果可与apple、cherry、banana同天发放

测试场景数据

基础场景(总水果数=7)

输入数据:

fruit  count   
apple  3  
orange 1  
lemon  1  
cherry 1  
banana 1

预期输出:

day fruit
d1   apple
d2   cherry
d3   apple
d4   lemon
d5   apple
d6   banana
d7   orange

场景1(总水果数<7)

输入数据:

fruit  count   
apple  1  
orange 1  
lemon  1  
cherry 1  
banana 1

预期输出:

day fruit
d1   apple
d2   cherry
d4   lemon
d6   banana
d7   orange

场景2(总水果数>7)

输入数据:

fruit  count  
apple  3  
orange 1
pomegranate 1  
lemon  1  
cherry 1  
banana 1 

预期输出:

day fruit
d1   apple
d2   cherry
d3   apple
d3   pomegranate
d4   lemon
d5   apple
d6   banana
d7   orange

调整后实现代码

import pandas as pd

def allocate_fruits(fruit_df):
    # 初始化7天存储结构
    day_map = {f'd{i}': [] for i in range(1, 8)}
    # 规则2:固定第7天放orange
    day_map['d7'].append('orange')
    fruit_cnt = fruit_df.set_index('fruit')['count'].to_dict()
    
    # 第一步:分配apple,满足间隔要求,避开第7天
    apple_num = fruit_cnt.get('apple', 0)
    available_apple_days = ['d1', 'd3', 'd5']
    for i in range(apple_num):
        if i < len(available_apple_days):
            day_map[available_apple_days[i]].append('apple')
    
    # 第二步:分配lemon,满足规则3、4
    lemon_num = fruit_cnt.get('lemon', 0)
    if lemon_num > 0:
        # 筛选符合要求的空日期:不能是d6、d7,当天无其他水果
        available_lemon_days = [d for d in day_map.keys() if d not in ['d6', 'd7'] and len(day_map[d]) == 0]
        if available_lemon_days:
            # 选最靠后的日期保证和orange间隔足够
            day_map[available_lemon_days[-1]].append('lemon')
    
    # 第三步:分配其他普通水果
    normal_fruits = []
    for fruit, cnt in fruit_cnt.items():
        if fruit not in ['apple', 'orange', 'lemon']:
            normal_fruits.extend([fruit]*cnt)
    
    # 优先填充空白日期
    empty_days = [d for d in day_map.keys() if len(day_map[d]) == 0]
    for idx, fruit in enumerate(normal_fruits):
        if idx < len(empty_days):
            day_map[empty_days[idx]].append(fruit)
        else:
            # 多余水果放到允许混放的日期
            for d in day_map.keys():
                if len(set(day_map[d]) & {'lemon', 'orange'}) == 0:
                    day_map[d].append(fruit)
                    break
    
    # 转换为pandas DataFrame输出
    res = []
    for day, fruits in day_map.items():
        for f in fruits:
            res.append({'day': day, 'fruit': f})
    return pd.DataFrame(res)

# 测试示例,替换fruit_df即可适配不同场景
fruit_df = pd.DataFrame({
    'fruit': ['apple', 'orange', 'lemon', 'cherry', 'banana', 'pomegranate'],
    'count': [3, 1, 1, 1, 1, 1]
})
print(allocate_fruits(fruit_df))

内容的提问来源于stack exchange,提问作者rakesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 15:15:00