仅在字典中使用第一键进行循环

时间:2019-09-11 13:12:55

标签: python pandas

我正在尝试计算项目是否已延迟。我有一本包含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 = {"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

2 个答案:

答案 0 :(得分:2)

  

如果数据帧值高于dict值,则应为“ True”。

不可理解。但是在您的代码中,如果您未点击$countryN = $_REQUEST['id']; $brfilterresult = ("SELECT Business_Rule_Name, Country, Data_Stream, Region, ActionNeeded FROM businessrulestbl WHERE Country='".$countryN."'"); ,您还将返回False。因此,对于第一个元素,您总是返回一些内容,因此退出该函数。 ;)

True摆脱else,它应该可以工作:

return False

答案 1 :(得分: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

编辑:

要通过多个值创建可能的映射,请使用左连接创建助手DataFramemerge

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')