我有一个df,我需要将列标记为’1’如果我的.apply()中的行与我的字典中的项匹配.但是,如果我的字典为空或者不包含与该实例的.apply()中的行相同的“密钥”,则脚本将失败.我如何通过这个hickup进步?
df = pd.DataFrame({'Key': ['10003', '10003', '10003', '10003', '10003','10003','10034'],
'Num1': [12,13,30,12,13,13,16],
'Num2': [121,122,122,124,125,126,127],
'admit': [2015019, 20150124, 20150206,20150211,20150220,20150407,20150211],
'discharge': [20150123, 20150202, 20150211,20150220,20150304,20150410,20150211]})
df['admit'] = pd.to_datetime(df['admit'], format='%Y%m%d')
df['discharge'] = pd.to_datetime(df['discharge'], format='%Y%m%d')
#df=df.head(5)
脚本:
d2 = df[df['discharge'].isin(range(30,40))].groupby('Key')['discharge'].apply(set).to_dict()
def find(x):
match2 = x['admit'] in d2[x['Key']]
return match2
df['flag'] = df.apply(find, axis=1).astype(int)
特别是,我需要标记一列,其中一行的许可日期等于另一行的排放日期.具有匹配排放日期的行在Num1中的值在30-40之间.如果将df减少到仅5行df = df.head(5),此脚本将按预期工作.但是当有些行的’Key’不在字典中时,脚本会返回错误.我想知道如果为字典添加所有“关键”和空白日期会使这个工作吗?
KeyError: ('10034', 'occurred at index 6')
我想使用字典来执行上述任务,因为我的函数的其余部分具有与此类似的条件(那些更简单).上面的代码可以在一个小样本上运行,但我的字典经验很少,这让我很难过.对不起,如果这是一个简单而愚蠢的问题.
最终df:
Key Num1 Num2 admit discharge flag
0 10003 12 121 2015-01-09 2015-01-23 0
1 10003 13 122 2015-01-24 2015-02-02 0
2 10003 30 122 2015-02-06 2015-02-11 0
3 10003 12 124 2015-02-11 2015-02-20 1
4 10003 13 125 2015-02-20 2015-03-04 0
5 10003 13 126 2015-04-07 2015-04-10 0
6 10034 16 127 2015-02-11 2015-02-11 0
最佳答案 您可以使用dict.get并返回一个空列表.
例如:
def find(x):
match2 = x['admit'] in d2.get(x['Key'], [])
return match2