这是玩具数据,可以很好地从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
。如何解决以获得实际数据的最大索引?
最佳答案
编辑:
如果不是空列表,则并非所有的假列表和列表的长度总是相同的,可以使用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
关于python - Pandas 不为空,但获取max()arg为空序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48355809/