[英]how to python loop with conditions
我一直在嘗試對此編碼。 這是一個示例數據框:
capacity = 500
s = pd.Series(['School 1','School 2', 'School 3','School 4', 'School 5'])
p = pd.Series(['132', '458', '333', '300', '258'])
d = pd.Series(['1', '2', '3', '4', '5'])
df = pd.DataFrame(np.c_[s,p,d],columns = ['School Name','Population', 'Distance'])
我想做的是做一個循環,其中循環將不斷地從“容量”中減去“人口”,只要它不超過容量。 它需要檢查訂單的“距離”。
示例:由於“學校1”是最近的學校,因此從500中減去132,即368。但是由於“學校2”是第二個最近的學校,但是人口超過368(458> 368),因此它將在此處停止,因此不再繼續查看最近的學校“學校3”。
之后,應將學校名稱分配到另一列
最終結果將是:
s = pd.Series(['School 1','School 2', 'School 3','School 4', 'School 5'])
p = pd.Series(['132', '458', '333', '300', '258'])
d = pd.Series(['1', '2', '3', '4', '5'])
sn = pd.Series(['School 1', 0, 0 ,0 ,0])
df2 = pd.DataFrame(np.c_[s,p,d,sn],columns = ['School Name','Population', 'Distance','Included'])
從昨天開始一直在嘗試進行此工作,但除了手動之外,仍然不知道如何進行。 仍然是初學者python用戶。
謝謝您的幫助!
根據您的問題,我假設您只想在超出容量之前就使用一個學校名稱。 可以這樣實現:
import pandas as pd
import numpy as np
capacity = 500
s = pd.Series(['School 1','School 2', 'School 3','School 4', 'School 5'])
p = pd.Series(['132', '458', '333', '300', '258'])
d = pd.Series(['1', '2', '3', '4', '5'])
df = pd.DataFrame(np.c_[s,p,d],columns = ['School Name','Population', 'Distance'])
# converting population to integer values
p = p.astype('int')
# placeholder to store school name
school_name = None
for idx, val in enumerate(p):
# keep assigning school name until capacity is exceeded
capacity -= val
if capacity < 0:
break
school_name = s[idx]
# add included column
df['included'] = np.where(df['School Name'] == school_name, df['School Name'], 0)
然后,您可以打印df
以查看它確實可以工作:
>>> df1
School Name Population Distance included
0 School 1 132 1 School 1
1 School 2 458 2 0
2 School 3 333 3 0
3 School 4 300 4 0
4 School 5 258 5 0
但是,假設您要保留所有學校,直到超出容量為止,這很簡單,就是修改上述程序..只需替換占位符和如下所示的循環即可:
school_names = [] # placeholder will be a list now
for idx, val in enumerate(p):
capacity -= val
if capacity < 0:
break
school_names.append(s[idx]) # keep adding schools that do not exceed capacity to the list
# Instead of equality, check if school name is in your list
df['included'] = np.where(df['School Name'].isin(school_names), df['School Name'], 0)
現在,如果您的capacity = 500
並且您更改第二個總體,使得p = pd.Series(['132', '128', '333', '300', '258'])
則School 1
和School 2
將被包括在內。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.