Pandas 根据另一列的条件有选择地覆盖列中的值

lar*_*cat 5 python apply pandas

我有一个带有四列的 pandas 数据框。数据由字符串组成。样本:

          A                  B                C      D
0         2          asicdsada          v:cVccv      u
1         4     ascccaiiidncll     v:cVccv:ccvc      u
2         9                sca              V:c      u
3        11               lkss             v:cv      u
4        13              lcoao            v:ccv      u
5        14           wuduakkk         V:ccvcv:      u
Run Code Online (Sandbox Code Playgroud)

如果该行中的 Col C 包含子字符串“V”(区分大小写),我想将 D 列中的字符串“u”替换为字符串“a”。期望的结果:

          A                  B                C      D
0         2          asicdsada          v:cVccv      a
1         4     ascccaiiidncll     v:cVccv:ccvc      a
2         9                sca              V:c      a
3        11               lkss             v:cv      u
4        13              lcoao            v:ccv      u
5        14           wuduakkk         V:ccvcv:      a
Run Code Online (Sandbox Code Playgroud)

我更喜欢覆盖 D 列中已有的值,而不是分配两个不同的值,因为我想稍后在不同的条件下选择性地再次覆盖其中一些值。

看起来这应该有一个简单的解决方案,但我无法弄清楚,并且无法在其他已回答的问题中找到完全适用的解决方案。

df.ix[1]["D"] = "a"
Run Code Online (Sandbox Code Playgroud)

改变个体的价值。

df.ix[:]["C"].str.contains("V")
Run Code Online (Sandbox Code Playgroud)

返回一系列布尔值,但我不确定如何处理它。我尝试过 .loc、apply、contains、re.search 和 for 循环的许多组合,但要么出现错误,要么替换 D 列中的每个值。我是 pandas/python 的新手,所以很难知道是否我的语法、方法或我需要做的事情的概念化都是错误的(可能是以上所有)。

DSM*_*DSM 6

正如您已经尝试过的那样,使用str.contains获取布尔系列,然后使用.loc说“更改这些行和 D 列”。例如:

In [5]: df.loc[df["C"].str.contains("V"), "D"] = "a"

In [6]: df
Out[6]: 
    A               B             C  D
0   2       asicdsada       v:cVccv  a
1   4  ascccaiiidncll  v:cVccv:ccvc  a
2   9             sca           V:c  a
3  11            lkss          v:cv  u
4  13           lcoao         v:ccv  u
5  14        wuduakkk      V:ccvcv:  a
Run Code Online (Sandbox Code Playgroud)

(避免使用.ix——它现在已被正式弃用。)