簡體   English   中英

for循環只使用dict中的第一個鍵

[英]for loop only using 1st key in dict

我正在嘗試計算某件商品是否已延遲。 我有一個包含20多個鍵和值的字典,我試圖遍歷我的數據集中的行,如果數據幀值高於dict值,它應該導致“True”。

似乎循環只使用了dict中的第一個值,我嘗試將其更改為無效。

這是我正在使用的當前代碼:

def delaytest(df):
    for key, value in mydict.items():
        if (key == df["serviceType"]) & (value < (df["delayTime"]/60)):
            return True

        else:
            return False

df["delay"] = df.apply(delaytest, axis=1)

示例dict:

dict = {"key1": 5,
        "key2": 10,
        "key3": 15}
df before:
    serviceType   delayTime
    key1          6
    key2          11
    key2          12
    key1          4
    key3          16
    key3          14

df after:
       serviceType   delayTime  delay
    key1          6          True
    key2          11         False
    key2          12         False
    key1          4          False
    key3          16         False
    key3          14         False

df expected:
    serviceType   delayTime  delay
    key1          6          True  
    key2          11         True
    key2          12         True
    key1          4          False
    key3          16         True
    key3          14         False

如果數據幀值高於dict值,則應該為“True”。

Undestandable。 但是在你的代碼中,如果你沒有點擊True ,你也會返回False 因此,對於第一個元素,您總是返回一些東西,因此退出該函數。 ;)

使用return False擺脫else ,它應該工作:

def delaytest(df):
    for key, value in mydict.items():
        if (key == df["serviceType"]) & (value < (df["delayTime"]/60)):
            return True

df["delay"] = df.apply(delaytest, axis=1)

我認為這里最好使用Series.map進行新系列,並按列delayTime進行比較:

df["delay"] = df['serviceType'].map(mydict) < df["delayTime"]
print (df)
  serviceType  delayTime  delay
0        key1          6   True
1        key2         11   True
2        key2         12   True
3        key1          4  False
4        key3         16   True
5        key3         14  False

細節

print (df['serviceType'].map(mydict))
0     5
1    10
2    10
3     5
4    15
5    15
Name: serviceType, dtype: int64

如果map的值不匹配,則獲取缺失值並且比較輸出為False

mydict = {"key1": 5,
        "key2": 10,
        "key4": 15}

df["delay"] = df['serviceType'].map(mydict) < df["delayTime"]
print (df)
  serviceType  delayTime  delay
0        key1          6   True
1        key2         11   True
2        key2         12   True
3        key1          4  False
4        key3         16  False
5        key3         14  False

print (df['serviceType'].map(mydict))
0     5.0
1    10.0
2    10.0
3     5.0
4     NaN
5     NaN
Name: serviceType, dtype: float64

編輯:

對於可能的多個值映射,創建幫助器DataFrame並與左連接merge

pairs = [('cat1','prov1', 'content1'),
         ('cat2','prov2', 'content2'),
         ('cat3','prov3', 'content3')]
df1 = pd.DataFrame(pairs, columns=['category','provider','contentType'])
print (df1)

df = df.merge(df1, how='left')

暫無
暫無

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

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