函数中的IF-ELSE条件引发TypeError __floordiv__、ValueError、KeyError



我需要根据一些条件读入一堆I/p数据帧,然后将它们合并,最后创建数据帧,如"merge_m0"、"merge_m1"、"merge_m2"等等。

在实际的代码中,我需要阅读大约20个数据帧。但是,为了简单易懂,我展示了3个数据帧,下面是可以很好地进行"合并"的代码。

然而,对于"merge"之后的IF-ELSE条件,它会抛出各种错误。我正在使用globals((创建merge_m0、merge_m1、merge_m2……数据帧,但不知道如何使用它。

输入数据帧

df0=pd.DataFrame({'id':[1,2,4],'m0_val':[1,8,10],'name':['A','B','C'],'m0_orig_val':[2,3,4],'m0_int_dt':['07/15/2019','03/21/2019','08/10/2019'],'m0_bpo_dt':['10/15/2019','04/12/2019','06/08/2019']})
df1=pd.DataFrame({'id':[1,2,4],'m1_val':[8,10,1],'name':['D','E','F'],'m1_orig_val':[2,3,4],'m1_int_dt':['02/11/2018','04/06/2019','11/22/2019'],'m1_bpo_dt':['02/15/2018','09/11/2019','12/14/2019']})
df2=pd.DataFrame({'id':[1,2,4],'m2_val':[1,10,8],'name':['G','H','I'],'m2_orig_val':[2,3,4],'m2_int_dt':['10/01/2019','09/03/2018','12/22/2017'],'m2_bpo_dt':['11/15/2018','01/12/2019','08/08/2019']})

代码

import pandas as pd
import datetime
mydate1=datetime.date(2019,12,31)
df_list=[]
for i in range(0,3):
df_list.append(globals()[f'df{i}']) #appending all the above i/p dataframes to a list
def comb_mths(i):
dfa = df_list[i]
dfb = df_list[i+1]
dfma = dfa[dfa.iloc[:, 1].isin([1,8])] 
dfmb = dfb[(dfb.iloc[:, 1].isin([8,10])) & (dfb.iloc[:, 3].isin([2,3,4]))]
globals()[f"merge_m{i}"]  = dfma.merge(dfmb, how='inner', on=['id'])
#if (globals()[f"merge_m{i}"][f"m{i+1}_orig_val"].isin([2,4])):
if (globals()[f"merge_m{i}"][f"m{i+1}_orig_val"].isin([2,4])).any():
globals()[f"merge_m{i}"]['diff'] = mydate1-(globals()[f'merge_m{i}'][f'm{i+1}_int_dt'])//np.timedelta64(1,'M')
globals()[f'merge_m{i}']['mnths'] = globals()[f"merge_m{i}"]['diff']  - (i-1)
elif (globals()[f"merge_m{i}"][f"m{i+1}_orig_val"].isin([3,5])).any():
globals()[f"merge_m{i}"]['diff'] = mydate1-(globals()[f'merge_m{i}'][f'm{i+1}_bpo_dt'])//np.timedelta64(1,'M')
globals()[f'merge_m{i}']['mnths'] = globals()[f"merge_m{i}"]['diff']  - (i-1)

return globals()[f"merge_m{i}"] 
for i in range(0,2): 
comb_mths(i)
print(merge_m0)    
print(merge_m1)

IF-ELSE逻辑

在上述函数中;merge_m{i}";数据帧,我需要检查if-else条件并计算一个名为"mnths"的变量。if-else条件的伪代码的逻辑如下:

Ex: when i=0 (1st iteration)
if m1_orig_val isin (2,4):
diff = (mydate1 - m1_int_dt)//(np.timedelta64(1,'M'))
mnths = diff - (i-1)
elif m1_orig_val isin (3,5):
diff = (mydate1 - m1_bpo_dt)//(np.timedelta64(1,'M'))
mnths = diff - (i-1)
Ex: when i=1 (2nd iteration)
if m2_orig_val isin (2,4):
diff = (mydate1 - m2_int_dt)//(np.timedelta64(1,'M'))
mnths = diff - (i-1)
elif m2_orig_val isin (3,5):
diff = (mydate1 - m2_bpo_dt)//(np.timedelta64(1,'M'))
mnths = diff - (i-1)
Appreciate if anyone can please show me how do I add this if-else condition in the above function as I'm not sure how to do this using globals() and it's throwing bunch of errors? OR Pls let me know if there is any easy/better alternative to get this done. Thanks!!

编辑

*我做了什么:

更新了上述函数中的if-elif行,最初,它在第一个if条件下抛出错误为"0">ValueError:序列的真值不明确。使用a.empty、a.bool((、a.item((、.any((或.all((">

我在if条件中添加了.any((,但不确定这是否正确,或者我需要做其他事情吗

在添加了.any((之后,它现在在timedelta的下一行中抛出了一堆错误,我认为如下所述

文件";pandas/libs/tslibs/timedeltas.pyx";,第1440行,大熊猫_libs.tslibs.timedeltas.Timedelta.rfloordiv类型错误:floordiv的dtype对象无效

文件";pandas/libs/tslibs/timedeltas.pyx";,539号线,大熊猫_libs.tslibs.timedeltas.parse_timedelta_unitKeyError:"/">

值错误:无效单位缩写://em>

如果有人能帮助我修复这个if-else语句,我将不胜感激,或者请分享在上述功能中是否有其他(更好的(方法。非常感谢。

我自己想出了解决方案:

以下是更新后的功能。早些时候,在计算"mths"的If Else条件中,我使用了"np.timedelta64",它抛出了各种错误,现在我用不同的逻辑替换了它,并将日期列转换为"日期"类型。现在,该函数运行得非常好,并给出了预期的结果。

带有更新代码的解决方案

import pandas as pd
import numpy as np
import datetime
mydate2=pd.Timestamp('2019-12-31')
df_list=[]
for i in range(0,3):
df_list.append(globals()[f'df{i}'])
def comb_mths(i):
dfa = df_list[i]
dfb = df_list[i+1]
dfa.iloc[:,4]=pd.to_datetime(dfa.iloc[:,4])
dfa.iloc[:,5]=pd.to_datetime(dfa.iloc[:,5])
dfb.iloc[:,4]=pd.to_datetime(dfb.iloc[:,4])
dfb.iloc[:,5]=pd.to_datetime(dfb.iloc[:,5])
dfma = dfa[dfa.iloc[:, 1].isin([1,8])] 
dfmb = dfb[(dfb.iloc[:, 1].isin([8,10])) & (dfb.iloc[:, 3].isin([2,3,4]))]
globals()[f"merge_m{i}"]  = dfma.merge(dfmb, how='inner', on=['id'])
if (globals()[f"merge_m{i}"][f"m{i+1}_orig_val"].isin([2,4])).any():
globals()[f"merge_m{i}"]["intnx_dt"]=mydate2-pd.offsets.DateOffset(months=i+1)+pd.offsets.MonthEnd(0)
globals()[f"merge_m{i}"]['mths']=(globals()[f"merge_m{i}"]["intnx_dt"].dt.year-globals()[f'merge_m{i}'][f'm{i+1}_int_dt'].dt.year)*12+ 
(globals()[f"merge_m{i}"]["intnx_dt"].dt.month-globals()[f'merge_m{i}'][f'm{i+1}_int_dt'].dt.month)
elif (globals()[f"merge_m{i}"][f"m{i}_orig_val"].isin([3,5])).any():
globals()[f"merge_m{i}"]["intnx_dt"]=mydate2-pd.offsets.DateOffset(months=i+1)+pd.offsets.MonthEnd(0)
globals()[f"merge_m{i}"]['mths']=(globals()[f"merge_m{i}"]["intnx_dt"].dt.year-globals()[f'merge_m{i}'][f'm{i+1}_bpo_dt'].dt.year)*12+
(globals()[f"merge_m{i}"]["intnx_dt"].dt.month-globals()[f'merge_m{i}'][f'm{i+1}_bpo_dt'].dt.month)
return globals()[f"merge_m{i}"]
for i in range(0,2): 
comb_mths(i)

输出

id  m0_val name_x  m0_orig_val  m0_int_dt  m0_bpo_dt  m1_val name_y  m1_orig_val  m1_int_dt  m1_bpo_dt   intnx_dt  mths
0   1       1      A            2 2019-07-15 2019-10-15       8      D            2 2019-07-17 2018-02-15 2019-11-30     4
1   2       8      B            3 2019-03-21 2019-04-12      10      E            3 2019-03-18 2019-09-11 2019-11-30     8
id  m1_val name_x  m1_orig_val  m1_int_dt  m1_bpo_dt  m2_val name_y  m2_orig_val  m2_int_dt  m2_bpo_dt   intnx_dt  mths
0   4       1      F            4 2019-11-22 2019-12-14       8      I            4 2019-05-29 2019-08-08 2019-10-31     5

最新更新