社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

如何使用Python将类别的第一行和最后一行的值替换为“0”?

Andi Khalil Gibran • 3 年前 • 1380 次点击  

我还是python的新手。我有这样一个问题:

我想用0替换第一行和最后一行的值。以下是我的数据(存储在Dataframe中):

类别 价值
2000-1 500
2000-1 200
2000-1 20
2000-1 350
2000-2 250
2000-2 210
2000-2 320
3000-1 330
3000-1 370
3000-1 85
4000-3 91
4000-3 92
4000-3 88
4000-5 87
4000-5 77
4000-5 76

以下是预期输出:

类别 价值
2000-1 0
2000-1 200
2000-1 20
2000-1 0
2000-2 0
2000-2 210
2000-2 320
3000-1 0
3000-1 370
3000-1 0
4000-3 0
4000-3 92
4000-3 0
4000-5 0
4000-5 77
4000-5 0

谢谢,需要你的帮助吗

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/131569
文章 [ 2 ]  |  最新文章 3 年前
jch
Reply   •   1 楼
jch    3 年前

通过 transform() :

def first_last_0(x):
    x.iloc[0] = 0 
    x.iloc[-1] = 0
    return x

df['Value'] = df.groupby('Category')['Value'].transform(first_last_0)

0       0
1     200
2      20
3       0
4       0
5     210
6       0
7       0
8     370
9       0
10      0
11     92
12      0
13      0
14     77
15      0
enke
Reply   •   2 楼
enke    3 年前

如果“值”中的值对于每个“类别”都是唯一的(如示例中所示),我们可以:

(一) groupby “类别”并选择“值”列

(ii)找出每组的第一个和最后一个元素

(iii)创建一个布尔掩码,标识每个组的第一个和最后一个元素

(iv)戴上口罩 df['Value'] 并指定0。

gb_obj = df.groupby('Category')['Value']    
firsts = gb_obj.transform('first')
lasts = gb_obj.transform('last')
msk = (df['Value'] == firsts) | (df['Value'] == lasts)
df.loc[msk, 'Value'] = 0

如果没有,我们可以对“值”应用一个函数,将0分配给每个组中的第一个和最后一个元素:

def first_last_to_zero(g):
    g.iloc[0] = g.iloc[-1] = 0
    return g

df['Value'] = df.groupby('Category')['Value'].apply(first_last_to_zero)

输出:

   Category  Value
0    2000-1      0
1    2000-1    200
2    2000-1     20
3    2000-1      0
4    2000-2      0
5    2000-2    210
6    2000-2      0
7    3000-1      0
8    3000-1    370
9    3000-1      0
10   4000-3      0
11   4000-3     92
12   4000-3      0
13   4000-5      0
14   4000-5     77
15   4000-5      0