熊猫列的第二大行

时间:2019-05-13 07:37:13

标签: 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 |

我目前编写的代码如下:

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')

谢谢

1 个答案:

答案 0 :(得分:1)

如果每行至少有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

如果可能的话,每行的所有值都是唯一的,则会出现如下错误:

  

IndexError :(“索引1超出了轴0的大小1的范围,'发生在索引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