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,当然是向最好的人学习,绝对谦卑。我现在知道了!