Python pandas-按值选择/屏蔽前n个元素

Python pandas-按值选择/屏蔽前n个元素,python,pandas,Python,Pandas,从单个数据帧开始: I,a,b,c,d,e,f A,1,3,5,6,4,2 B,3,4,7,1,0,0 C,1,3,5,2,0,7 我希望通过值保留/屏蔽行中的前三个元素,保持列的顺序,以便生成的dataframe显示为: I,a,b,c,d,e,f A,0,0,5,6,4,0 B,3,4,7,0,0,0 C,0,3,5,0,0,7 到目前为止,我已经能够使用以下方法对数据帧进行排序: a = df.values 及 以便: [[1 1 2 3 4 5] [0 0 1 1 3 4] [

从单个数据帧开始:

I,a,b,c,d,e,f
A,1,3,5,6,4,2
B,3,4,7,1,0,0
C,1,3,5,2,0,7
我希望通过值保留/屏蔽行中的前三个元素,保持列的顺序,以便生成的dataframe显示为:

I,a,b,c,d,e,f
A,0,0,5,6,4,0
B,3,4,7,0,0,0
C,0,3,5,0,0,7
到目前为止,我已经能够使用以下方法对数据帧进行排序:

a = df.values

以便:

[[1 1 2 3 4 5]
 [0 0 1 1 3 4]
 [0 1 1 3 5 7]]

获取已排序的numpy数组,丢失有关列的信息。

您可以按行排列值,然后对其进行筛选并调用
fillna

In [248]:
df[df.rank(axis=1, method='min')>3].fillna(0)

Out[248]:
   I  a  b  c  d  e  f
0  0  0  0  5  6  4  0
1  0  3  4  7  0  0  0
2  0  0  3  5  0  0  7
然后,您可以将此返回以返回“I”列:

In [268]:
pd.concat([df['I'], df[df.rank(axis=1, method='min')>3].fillna(0)[df.columns[1:]]], axis=1)

Out[268]:
   I  a  b  c  d  e  f
0  A  0  0  5  6  4  0
1  B  3  4  7  0  0  0
2  C  0  3  5  0  0  7
来自中间dfs的输出:

In [269]:

df.rank(axis=1, method='min')
Out[269]:
   a  b  c  d  e  f
0  1  3  5  6  4  2
1  4  5  6  3  1  1
2  2  4  5  3  1  6
In [270]:

df.rank(axis=1, method='min')>3
Out[270]:
       a      b     c      d      e      f
0  False  False  True   True   True  False
1   True   True  True  False  False  False
2  False   True  True  False  False   True

谢谢你,艾德!再一次!实际上,在读取时设置索引可以避免concat!所以你在寻找df[df.rank(axis=1,method='min')抱歉,Ed,我刚刚意识到……我的意思是保持数据帧的三个最高值,而不是超过3。但是对于你的特定形状df,这就是我的代码所做的,如果你的实际df是一个不同的形状,那么你需要做类似于
df.rank(axis=1,method='min')>df.shape[1]的事情-3带有
df[df.rank(axis=1,method='min')的

In [269]:

df.rank(axis=1, method='min')
Out[269]:
   a  b  c  d  e  f
0  1  3  5  6  4  2
1  4  5  6  3  1  1
2  2  4  5  3  1  6
In [270]:

df.rank(axis=1, method='min')>3
Out[270]:
       a      b     c      d      e      f
0  False  False  True   True   True  False
1   True   True  True  False  False  False
2  False   True  True  False  False   True