这是玩具数据,它可以从True
列Pandas
的每个列表中获取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
。我可以修复什么来获取真实数据的最大索引?
答案 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