使用遵循的规则从数据框中排列给定值 - 熊猫
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']
【讨论】:
以上是关于使用遵循的规则从数据框中排列给定值 - 熊猫的主要内容,如果未能解决你的问题,请参考以下文章
如何使用正则表达式从熊猫数据框中的一行中的字符串中提取所有特定值?