我有一个数据框,其中一些日期作为行,列中的值。要了解一下,df如下所示:
print(df1)
c1 c2 c3 c4
12/12/2016 38 10 1 8
12/11/2016 44 12 17 46
12/10/2016 13 6 2 7
12/09/2016 9 16 13 26
我想创建一个规则,使它对df1中的每一行进行排名,并创建另一个数据帧,在其中存储一些常数值。例如,为每行的2个最高值分配值k = 5,为最低的2个值分配值y = -9
我想要获得以下df:
c1 c2 c3 c4
12/12/2016 5 5 -9 -9
12/11/2016 5 -9 -9 5
12/10/2016 5 -9 -9 5
12/09/2016 -9 5 -9 5
我曾考虑过在df1上使用np.partition,但是我对如何创建新的数据框一无所知。任何提示高度赞赏!
谢谢!
答案 0 :(得分:5)
将rank
与numpy.where
和DataFrame
建设者一起使用:
arr = np.where(df.rank(axis=1, method='dense') > 2, 5, -9)
df = pd.DataFrame(arr, index=df.index, columns=df.columns)
print (df)
c1 c2 c3 c4
12/12/2016 5 5 -9 -9
12/11/2016 5 -9 -9 5
12/10/2016 5 -9 -9 5
12/09/2016 -9 5 -9 5
答案 1 :(得分:0)
这是NumPy解决方案:
df.iloc[:] = np.where(df.values.argsort(1).argsort(1) > 1, 5, -9)
print(df)
c1 c2 c3 c4
12/12/2016 5 5 -9 -9
12/11/2016 5 -9 -9 5
12/10/2016 5 -9 -9 5
12/09/2016 -9 5 -9 5