簡體   English   中英

如何在條件下進行python循環

[英]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 1School 2將被包括在內。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM