[英]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.