首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Pandas在Python中基于同一行中的另一个单元格设置单元格值

问如何使用Pandas在Python中基于同一行中的另一个单元格设置单元格值
EN

Stack Overflow用户
提问于 2021-11-16 05:52:11
回答 2查看 60关注 0票数 1

我正在摸索Python和Pandas库,尝试一些基本的东西,但在文档中迷失了方向。

我有一台Pandas DataFrame

代码语言:javascript
复制
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%的行

此外,这种方式改变了最初的顺序,这是不可取的。

代码语言:javascript
复制
 df = df.sort_values('D',ascending=False)
 df.iloc[:0, :(df.shape[0]-1)/10, 5] = value    --- this doesn't work.

只是检查是否有一种方法可以在不排序的情况下实现这一点?如果没有,如果前10%的行已排序,如何更新它们?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-16 06:11:02

如果需要top10值而不使用重复项进行排序,请使用np.argsort

代码语言:javascript
复制
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进行比较

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2021-11-16 06:13:41

如果你不想使用内置的quantile。使用排序方法:-

代码语言:javascript
复制
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_val
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69984343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档