为了账号安全,请及时绑定邮箱和手机立即绑定

在pandas列内映射值

在pandas列内映射值

慕神8447489 2021-05-03 12:13:37
我使用下面的代码将S列中的2个值映射为0,但是它不起作用。关于如何解决这个问题的任何建议?注意:我想在地图内部实现一个外部函数。 df = pd.DataFrame({   'Age': [30,40,50,60,70,80],   'Sex': ['F','M','M','F','M','F'],   'S'  : [1,1,2,2,1,2] }) def app(value):     for n in df['S']:         if n == 1:             return 1         if n == 2:             return 0 df["S"] = df.S.map(app)
查看完整描述

3 回答

?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

使用eq创建布尔系列和CONVER那布尔系列INT有astype:


df['S'] = df['S'].eq(1).astype(int)

或者


df['S'] = (df['S'] == 1).astype(int)

输出:


   Age Sex  S

0   30   F  1

1   40   M  1

2   50   M  0

3   60   F  0

4   70   M  1

5   80   F  0


查看完整回答
反对 回复 2021-05-11
?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

不要使用apply,只需使用loc即可分配值:


df.loc[df.S.eq(2), 'S'] = 0


   Age Sex  S

0   30   F  1

1   40   M  1

2   50   M  0

3   60   F  0

4   70   M  1

5   80   F  0

如果您需要性能更高的选项,请使用np.select。这也更具可伸缩性,因为您可以随时添加更多条件:


df['S'] = np.select([df.S.eq(2)], [0], 1)


查看完整回答
反对 回复 2021-05-11
?
桃花长相依

TA贡献1860条经验 获得超8个赞

您已接近,但需要进行一些更正。由于要使用函数,因此请删除for循环并替换n为value。此外,请使用apply代替map。Apply一次对整个列进行操作。有关如何正确使用vs vs的信息,请参见此答案applyapplymapmap


def app(value):

    if value == 1:

        return 1

    elif value == 2:

        return 0

df['S'] = df.S.apply(app)

   Age Sex  S

0   30   F  1

1   40   M  1

2   50   M  0

3   60   F  0

4   70   M  1

5   80   F  0


查看完整回答
反对 回复 2021-05-11
  • 3 回答
  • 0 关注
  • 168 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号