繁体   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