Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 多个列的第二大行_Python_Python 3.x_Pandas - Fatal编程技术网

Python 多个列的第二大行

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 | 我目前编写的代

我有一个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 |
我目前编写的代码如下:

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或只有一个唯一的值,但出于我的目的不需要它们,所以只需在之前删除它们。