pandas - 按值选择/掩盖前n个元素

时间:2015-07-14 13:48:02

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

我想保留/屏蔽行中的前三个元素,保持列的顺序,以便生成的数据框显示为:

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

a.sort(axis=1)

这样:

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

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

1 个答案:

答案 0 :(得分:1)

您可以按行排列值,然后过滤它们并调用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