Py学习  »  Python

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

Andi Khalil Gibran • 4 年前 • 1772 次点击  

我还是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 ]  |  最新文章 4 年前
jch
Reply   •   1 楼
jch    4 年前

通过 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    4 年前

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

(一) 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