我有一个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')
谢谢
答案 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