Python 多个列的第二大行
我有一个Pandas数据框架,并希望在下表中按行至少取多个6列,我希望在下表中输入6行并获得行min:Python 多个列的第二大行,python,python-3.x,pandas,Python,Python 3.x,Pandas,我有一个Pandas数据框架,并希望在下表中按行至少取多个6列,我希望在下表中输入6行并获得行min: +-col1-col2-col3-col4-col5-col6-Min-+ | 1 2 3 4 5 6 2 | | 6 5 4 3 2 2 3 | | 7 8 9 10 11 12 8 | | 90 80 70 60 70 80 70 | 我目前编写的代
+-col1-col2-col3-col4-col5-col6-Min-+
| 1 2 3 4 5 6 2 |
| 6 5 4 3 2 2 3 |
| 7 8 9 10 11 12 8 |
| 90 80 70 60 70 80 70 |
我目前编写的代码如下:
a1_raw_data['Best6Sec'] = a1_raw_data.iloc[:, [21, 23, 25, 27, 29, 31]].apply(lambda row: row.nlargest(2).values[-1], axis=1)
它试图按第21、23、25、27、29和31列的行获取最小值。它通过获取最大的行并获取每个行中的最后一个值来实现这一点。但我收到一条错误消息,上面说:
IndexError: ('index -1 is out of bounds for axis 0 with size 0', 'occurred at index 0')
谢谢如果每行至少有2个唯一值,请首先通过
dropna
删除错误值,获取唯一值,排序并通过索引选择第二个值:
df = a1_raw_data.iloc[:, [21, 23, 25, 27, 29, 31]]
a1_raw_data['Min'] = df.apply(lambda row: np.sort(np.unique(row.dropna()))[1], axis=1)
print (a1_raw_data)
col1 col2 col3 col4 col5 col6 Min
0 1 2 3 4 NaN 6 2.0
1 2 2 2 3 2.0 2 3.0
2 7 8 9 10 11.0 12 8.0
3 90 80 70 60 70.0 80 70.0
如果可能,每行的所有值都是唯一的,获取错误如下:
索引器错误:(“索引1超出大小为1的轴0的界限”,“发生在索引1上”)
解决方案是筛选所有非唯一行并应用解决方案:
mask = df.nunique(axis=1) != 1
f = lambda row: np.sort(np.unique(row.dropna()))[1]
a1_raw_data.loc[mask, 'Min'] = df[mask].apply(f, axis=1)
print (a1_raw_data)
col1 col2 col3 col4 col5 col6 Min
0 1 2 3 4 NaN 6 2.0
1 2 2 2 2 2.0 2 NaN
2 7 8 9 10 11.0 12 8.0
3 90 80 70 60 70.0 80 70.0
很抱歉,示例出错,但现在已修复,我的意思是将第二个最低值放在最小列中,而不是最低值。谢谢你的方法似乎对我有效。但有没有办法让它忽略nan的,因为他们似乎正在上升到顶端,我宁愿它忽略他们。@Christopherl-这是一个复杂的解决方案,所以宁愿创建一个新的。df意味着什么?谢谢Jezrael。我使用第一种解决方案使它工作。我确实有一些行都是NaN或只有一个唯一的值,但出于我的目的不需要它们,所以只需在之前删除它们。