我正在尝试计算项目是否已延迟。我有一本包含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
答案 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
编辑:
要通过多个值创建可能的映射,请使用左连接创建助手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')