Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用另一列中的相同行值替换dataframe列中的值_Python_Pandas_Dataframe - Fatal编程技术网

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

Python 用另一列中的相同行值替换dataframe列中的值,python,pandas,dataframe,Python,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 val

我有一个熊猫数据框,看起来像这样:

            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
            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
我想根据标志条件将标志列值更改为其他列中相同的值。即,如果标志为1,则用同一行中的val_1替换1,如果标志为2,则用val_2替换1。我正在查看的输出如下所示:

            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
            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']]=。我不知道代码的右边是什么。

IIUC:

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

另一种方法是使用np.where for
numpy.where(条件,是,否)

在本例中,我使用嵌套的
np

np.where(如果Flag=2,取val_2,(取x)),其中takex是另一个np.where

输出


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

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。选择

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'])
这样做的目的是评估你所有的条件。保留默认值作为原始列。您可以在中添加更多条件,并使用|(管道)seprerators在parenths中包装或语句。i、 e
[(df['Flag']==1 | df['Flag']==2)]


不需要
掩码
,对吗?查找已经足够了。@显然,您是对的。这仅仅是因为
Flag
-1
-th column:-)。现在我使用的是简单的单行解决方案@wwnde,但我非常喜欢你对更复杂条件的选择。
np。选择
比两个嵌套的
np好。其中
感谢@Quang Hoang,当然是向最好的人学习,绝对谦卑。我现在知道了!