繁体   English   中英

用另一列中的相同行值替换 pandas dataframe 列中的值

[英]Replacing values in pandas dataframe column with same row value from another column

我有一个 pandas dataframe 看起来像这样:

            val_1   val_2   Flag
Date                       
2018-08-27  221.0  121.0     0
2018-08-28  222.0  122.0     1
2018-08-29  223.0  123.0     0
2018-08-30  224.0  124.0     2
2018-08-31  225.0  125.0     0

我想根据标志条件将标志列值更改为其他列的相同值。 即,如果 Flag 为 1,则将同一行中的 1 替换为 val_1,如果 Flag 为 2,则将其替换为 val_2。 我正在寻找的 output 看起来像这样:

            val_1   val_2   Flag
Date                       
2018-08-27  221.0  121.0     0
2018-08-28  222.0  122.0     222.0
2018-08-29  223.0  123.0     0
2018-08-30  224.0  124.0     124.0
2018-08-31  225.0  125.0     0

我知道我可以像这样使用.loc df.loc[df['Flag'] == 1, ['Flag']] = 我不知道代码右侧是什么。

国际大学联盟:

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])

Output:

            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

另一种方法是将 np.where 用于numpy.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

Output

在此处输入图像描述

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

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

你在这里做的是过滤你的 dataframe 并替换条件匹配的值。 在这种情况下,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 语句用 | 括在括号中。 (管道)分离器。 [(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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM