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