python - Pandas 不为空,但获取max()arg为空序列

标签 python python-2.7 pandas error-handling max

这是玩具数据,可以很好地从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/

相关文章:

python - 比较两个数据帧列并输出第三个

Python 3.6 没有名为 pip 的模块

python - 如何在 python 中创建优化的 3D 体积打包函数?

python - 快速协议(protocol) | Python包装器

python - PyMongo 抛出 "E11000 duplicate key error index"

python - 从行中提取每日值并使用日期创建新行

python - 当查询以注释开始时,python 的 sqlite3 中的隐式提交

python - pypy 任务中没有名为 sympy 的模块

python-2.7 - 用一系列非数字对象中的最近值替换 NaN?

python - 在 pandas/numpy 中实现分段函数的正确方法