使用遵循的规则从数据框中排列给定值 - 熊猫

Posted

技术标签:

【中文标题】使用遵循的规则从数据框中排列给定值 - 熊猫【英文标题】:Arrange the given values from a dataframe with followed rules - pandas 【发布时间】:2021-12-11 03:17:04 【问题描述】:

我有一个水果计数数据框。从数据框中我的总数为 7,这些水果每天每个水果将分发 7 天。

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

分果规则: 1.苹果果不宜连续寄送,苹果之间保持至少一天的间隔。 2.orange 必须在第 7 天(即最后一天)发送。 3.第6天不送柠檬,橙子和柠檬之间保持至少一天的间隔 4.其他水果不要搭配柠檬和橙子,如果水果数量超过7个就搭配苹果或樱桃或香蕉。

预期输出

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
pomerante 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

我试过了:

apple = 3
orange = 1
week = 7
start_day=1
end_day = 8
days = [f"Dayi" for i in range(start_day,end_day)]
profile = key : [] for key in days
profile["Day7"].append("orange")
c = 6 // apple

apple_day = 1
for i in range(apple):
    profile["Day".format(apple_day)].append("apple")
    apple_day += c

输出:

'Day1': ['apple'],
 'Day2': [],
 'Day3': ['apple'],
 'Day4': [],
 'Day5': ['apple'],
 'Day6': [],
 'Day7': ['orange']

【问题讨论】:

这可以通过线性规划来解决。在这里,您的决策变量将是 xij,其中 i 是日期,j 是水果。您可以使用 Pyomo 或 PuLP 包来解决 Python 中的这类问题。 没想到会花这么长时间,但是我给了你一个答案,它涵盖了几乎所有具有有效解决方案的极端示例。 【参考方案1】:

这是我最先进的解决方案,希望您能接受这个答案。

它适用于任何具有解决方案的极端示例:

basket_of_fruits = ['apple','apple','apple','cherry','cherry','banana','banana','orange','lemon','kiwi','kiwi']
n_days = 7
# Create day plan
plan = 
for i in range(n_days):
    plan['Day_'+str(i+1)] = []
# Set startiong values
apple_day = n_days % 2 +1
occupy = 1
days_occupied = []
# solve 1 orange
if 'orange' in basket_of_fruits:
    plan['Day_'+str(n_days)].append('orange')
    basket_of_fruits.remove('orange')
    days_occupied.append(n_days)
# solve 1 lemon
if 'lemon' in basket_of_fruits:
    plan['Day_'+str(n_days-2)].append('lemon')
    basket_of_fruits.remove('lemon')
    days_occupied.append(n_days-2)
# solve other fruit then apple, cherry or banana
basket_of_fruits_rest = basket_of_fruits.copy()
while 'apple' in basket_of_fruits_rest:
    basket_of_fruits_rest.remove('apple')
while 'cherry' in basket_of_fruits_rest:
    basket_of_fruits_rest.remove('cherry')
while 'banana' in basket_of_fruits_rest:
    basket_of_fruits_rest.remove('banana')
for i in range(len(basket_of_fruits_rest)):
    while occupy in days_occupied:
        occupy += 1
        if occupy > n_days:
            days_occupied = [n_days,n_days-2]
            occupy -= n_days
    selected_fruit = basket_of_fruits_rest[i]
    plan['Day_'+str(occupy)].append(selected_fruit)
    basket_of_fruits.remove(selected_fruit)
    days_occupied.append(occupy)
    occupy += 1

# solve cherry or banana
basket_of_fruits_rest = basket_of_fruits.copy()
while 'apple' in basket_of_fruits_rest:
    basket_of_fruits_rest.remove('apple')
for i in range(len(basket_of_fruits_rest)):
    while occupy in days_occupied:
        occupy += 1
        if occupy > n_days:
            days_occupied = [n_days,n_days-2]
            occupy -= n_days
    selected_fruit = basket_of_fruits_rest[i]
    plan['Day_'+str(occupy)].append(selected_fruit)
    basket_of_fruits.remove(selected_fruit)
    days_occupied.append(occupy)
    occupy += 1
    
# solve apples
while 'apple' in basket_of_fruits:
    while ('lemon' in plan['Day_'+str(apple_day)]) | ('orange' in plan['Day_'+str(apple_day)]) :
        apple_day += 2
        if apple_day > n_days:
            apple_day -= n_days-1
    
        
    plan['Day_'+str(apple_day)].append('apple')
    basket_of_fruits.remove('apple')
    apple_day += 2
    if apple_day > n_days:
        apple_day -= n_days-1

返回:

'Day_1': ['kiwi', 'banana'],
 'Day_2': ['kiwi', 'apple'],
 'Day_3': ['cherry'],
 'Day_4': ['cherry', 'apple'],
 'Day_5': ['lemon'],
 'Day_6': ['banana', 'apple'],
 'Day_7': ['orange']

【讨论】:

以上是关于使用遵循的规则从数据框中排列给定值 - 熊猫的主要内容,如果未能解决你的问题,请参考以下文章

使用百分位数从熊猫数据框中删除异常值

如何使用正则表达式从熊猫数据框中的一行中的字符串中提取所有特定值?

如何识别和标记熊猫数据框中的相似行

我正在尝试使用熊猫删除重复的连续元素并保留数据框中的最后一个值

从过滤的熊猫数据框中获取整数索引值

确定熊猫数据框中的列值何时更改