我有这个pandas
数据框:
artist track class1 class2 class3
0 Portishead Roads 0.00 1.00 0.0
1 Yo La Tengo Our Way to Fall 0.14 0.86 0.0
2 Radiohead Fake Plastic Trees 0.03 0.97 0.0
这两个用户输入变量:
input_value = 0.80
input_class = 'class2'
从这些变量中我想迭代数据框,
在所选 class2
中找到与 input_value
最接近的值,并对数据帧行重新排序,如下所示:
artist track class1 class2 class3
1 Yo La Tengo Our Way to Fall 0.14 0.86 0.0
2 Radiohead Fake Plastic Trees 0.03 0.97 0.0
0 Portishead Roads 0.00 1.00 0.0
其中 class2 值的接近程度决定行的顺序。
(0.86
最接近 0.80
,0.97
其次,依此类推..)
到目前为止我只找到了最接近的值,代码如下:
for col in df.ix[:,'class1':'class3']:
if col == input_class:
print min(df[col] - input_value)
但是我离我的目标还有一点距离。谁能指出我正确的方向?
最佳答案
尝试 argsort
的差异 + iloc
:
df = df.iloc[(df[input_class] - input_value).argsort()]
df
artist track class1 class2 class3
1 Yo La Tengo Our Way to Fall 0.14 0.86 0.0
2 Radiohead Fake Plastic Trees 0.03 0.97 0.0
0 Portishead Roads 0.00 1.00 0.0
或者,您可以使用 np.argsort
达到相同的效果。
df = df.iloc[np.argsort(df[input_class] - input_value)]
df
artist track class1 class2 class3
1 Yo La Tengo Our Way to Fall 0.14 0.86 0.0
2 Radiohead Fake Plastic Trees 0.03 0.97 0.0
0 Portishead Roads 0.00 1.00 0.0
<小时/>
使用reset_index
对索引重新排序。
df.result.reset_index(drop=1)
artist track class1 class2 class3
0 Yo La Tengo Our Way to Fall 0.14 0.86 0.0
1 Radiohead Fake Plastic Trees 0.03 0.97 0.0
2 Portishead Roads 0.00 1.00 0.0
关于python - 根据列值对数据框行重新排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46556434/