我正在摸索Python和Pandas库,尝试一些基本的东西,但在文档中迷失了方向。
我有一台Pandas DataFrame
A B C D
1 2 3 4
3 4 1 7
6 9 0 1..。其他10k+行。
我现在想添加一个列,名为'E‘,如果'D’的值在整个列的前10%,则应该显示为True/False。
我尝试过的一种方法是按列'D‘降序排序,然后更新前10%的行,这样我就可以排序了,但还没有想出如何更新前10%的行
此外,这种方式改变了最初的顺序,这是不可取的。
df = df.sort_values('D',ascending=False)
df.iloc[:0, :(df.shape[0]-1)/10, 5] = value --- this doesn't work.只是检查是否有一种方法可以在不排序的情况下实现这一点?如果没有,如果前10%的行已排序,如何更新它们?
谢谢
发布于 2021-11-16 06:11:02
如果需要top10值而不使用重复项进行排序,请使用np.argsort
np.random.seed(2021)
df = pd.DataFrame(np.random.randint(30, size=(20, 5)), columns=list('ABCDE'))
n = 10
N = int(len(df.index)*(n/100))
print (N)
2
df['mask'] = np.argsort(np.argsort(-df['E'].to_numpy())) < N
print (df)
A B C D E mask
0 20 21 25 0 13 False
1 22 12 27 29 21 True
2 29 24 12 22 6 False
3 6 6 1 5 7 False
4 1 14 1 28 5 False
5 26 2 16 3 17 False
6 16 18 22 27 20 False
7 29 24 5 17 6 False
8 10 14 7 21 6 False
9 9 21 22 25 18 False
10 10 4 13 10 19 False
11 25 18 26 15 8 False
12 10 12 21 11 19 False
13 1 14 17 25 18 False
14 7 21 19 27 12 False
15 23 19 9 4 9 False
16 7 25 7 7 20 False
17 27 29 11 27 19 False
18 18 14 25 27 18 False
19 21 18 26 0 20 True如果需要,可以使用所有top2值与Series.nlargest和Series.isin进行比较
df['mask'] = df['E'].isin(df['E'].nlargest(2))
print (df)
A B C D E mask
0 20 21 25 0 13 False
1 22 12 27 29 21 True
2 29 24 12 22 6 False
3 6 6 1 5 7 False
4 1 14 1 28 5 False
5 26 2 16 3 17 False
6 16 18 22 27 20 True
7 29 24 5 17 6 False
8 10 14 7 21 6 False
9 9 21 22 25 18 False
10 10 4 13 10 19 False
11 25 18 26 15 8 False
12 10 12 21 11 19 False
13 1 14 17 25 18 False
14 7 21 19 27 12 False
15 23 19 9 4 9 False
16 7 25 7 7 20 True
17 27 29 11 27 19 False
18 18 14 25 27 18 False
19 21 18 26 0 20 True发布于 2021-11-16 06:13:41
如果你不想使用内置的quantile。使用排序方法:-
top_10_pc = int(len(df.index) * 0.1)
min_val = min(df.sort_values(by=['D'], ascending=False)[:top_10_pc]['D'])
df['E'] = df['D'] >= min_valhttps://stackoverflow.com/questions/69984343
复制相似问题