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

用另一列中的相同行值替换熊猫数据框列中的值

用另一列中的相同行值替换熊猫数据框列中的值

Go
守着星空守着你 2022-10-11 16:07:32
我有一个看起来像这样的熊猫数据框:            val_1   val_2   FlagDate                       2018-08-27  221.0  121.0     02018-08-28  222.0  122.0     12018-08-29  223.0  123.0     02018-08-30  224.0  124.0     22018-08-31  225.0  125.0     0我想根据标志条件将标志列值更改为其他列的相同值。即,如果 Flag 为 1,则将同一行中的 1 替换为 val_1,如果 Flag 为 2,则将其替换为 val_2。我正在寻找的输出如下所示:            val_1   val_2   FlagDate                       2018-08-27  221.0  121.0     02018-08-28  222.0  122.0     222.02018-08-29  223.0  123.0     02018-08-30  224.0  124.0     124.02018-08-31  225.0  125.0     0我知道我可以.loc这样使用df.loc[df['Flag'] == 1, ['Flag']] =。我不知道代码右侧是什么。
查看完整描述

3 回答

?
慕斯王

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

另一种方法是使用 np.wherenumpy.where(condtion,yes,no)


在这种情况下,我使用嵌套np.where这样


np.where(If Flag=2,take val_2,(take x)) where takex is another np.where


df['Flag']=np.where(df['Flag']==1,df['val_1'],(np.where(df['Flag']==2,df['val_2'],df['Flag'])))

df

输出

//img1.sycdn.imooc.com//634524600001889002200160.jpg

查看完整回答
反对 回复 2022-10-11
?
喵喵时光机

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

有几种方法可以做到这一点,首先你的初始代码非常接近,你只需要结束分配:


df.loc[df['Flag'] == 1, 'Flag'] = df['val_1']

print(df)

         Date  val_1  val_2   Flag

0  2018-08-27  221.0  121.0    0.0

1  2018-08-28  222.0  122.0  222.0

2  2018-08-29  223.0  123.0    0.0

3  2018-08-30  224.0  124.0    2.0

4  2018-08-31  225.0  125.0    0.0

你在这里做的是过滤你的数据框并替换条件匹配的值。在这种情况下,Flag 等于 1。


既然你正在做多重评估,让我们使用np.select


import numpy as np

conditions = [df['Flag'].eq(1),

             df['Flag'].eq(2)]



choices = [df['val_1'],df['val_2']]


df['Flag'] = np.select(conditions,choices,default=df['Flag'])

这样做的目的是评估您拥有的所有条件。将默认值保留为原始列。您可以在其中添加更多条件,并将 OR 语句用 | 括在括号中。(管道)分离器。IE[(df['Flag'] == 1 | df['Flag'] == 2)]


         Date  val_1  val_2   Flag

0  2018-08-27  221.0  121.0    0.0

1  2018-08-28  222.0  122.0  222.0

2  2018-08-29  223.0  123.0    0.0

3  2018-08-30  224.0  124.0  124.0

4  2018-08-31  225.0  125.0    0.0


查看完整回答
反对 回复 2022-10-11
?
HUWWW

TA贡献1874条经验 获得超12个赞

国际大学联盟:


new_vals = df.lookup(df.index, df.columns[df.Flag-1])


df['Flag'] = df.Flag.mask(df.Flag>0, new_val)

注意:正如@Erfan 所评论的,这也可以:


df['Flag'] = df.lookup(df.index, df.columns[df.Flag-1])

输出:


            val_1  val_2  Flag

Date                          

2018-08-27  221.0  121.0     0

2018-08-28  222.0  122.0   222

2018-08-29  223.0  123.0     0

2018-08-30  224.0  124.0   124

2018-08-31  225.0  125.0     0


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

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信