Pandas不是空的但得到max()arg是一个空序列

时间:2018-01-20 11:54:44

标签: python python-2.7 pandas error-handling max

这是玩具数据,它可以从TruePandas的每个列表中获取allmz的最大索引到lastprec

df = pd.DataFrame({'time': pd.Series([1,1,1,3,3]),'allmz':([[True,True,True],[True,False,True],[False,True,False],[True,True,False],[True,False,False]]),'allint':([[11,31,31],[21,41,51],[41,51,51],[11,31,51],[1,51,11]])})

df['lastprec'] = df['allmz'].apply(lambda aa: max([i for i, x in enumerate(aa) if x]))
print df

>>>OUT
         allint                 allmz  time  lastprec
0  [11, 31, 31]    [True, True, True]     1         2
1  [21, 41, 51]   [True, False, True]     1         2
2  [41, 51, 51]  [False, True, False]     1         1
3  [11, 31, 51]   [True, True, False]     3         1
4   [1, 51, 11]  [True, False, False]     3         0

然而,在我的真实数据中,我得到了ValueError: max() arg is an empty sequence。唯一不同的是我从DataFrame打开Excel中的ref_df = pd.read_excel(ref_file, sheetname=ref_worksheet)(但未导入玩具数据)。这可能是我收到此错误的原因吗?或者还有其他什么?我检查了真实数据allmz,它不是空的,数据类型是list。我可以修复什么来获取真实数据的最大索引?

1 个答案:

答案 0 :(得分:0)

编辑:

如果不是空列表,并非所有False列表和lenfth列表始终相同,您可以使用numpy来提高性能:

df['lastprec'] = 2 - np.array(df['allmz'].values.tolist())[:,::-1].argmax(axis=1)
print (df)

         allint                  allmz  time  lastprec
0  [11, 31, 31]  [False, False, False]     1         2
1  [21, 41, 51]    [True, False, True]     1         2
2  [41, 51, 51]   [False, True, False]     1         1
3  [11, 31, 51]    [True, True, False]     3         1
4   [1, 51, 11]   [True, False, False]     3         0