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

时间:2017-06-16 19:19:40

标签: python pandas apply

我在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

我想替换字符串' u'在Col D中用字符串' a'如果该行中的Col C包含子串' V' (区分大小写)。 期望的结果:

          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

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

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

df.ix[1]["D"] = "a"

更改单个值。

df.ix[:]["C"].str.contains("V")

返回一系列布尔值,但我不知道如何处理它。我尝试了许多.loc,apply,contains,re.search和for循环的组合,我得到错误或替换D列中的每个值。我是pandas / python的新手所以它'我很难知道我的语法,方法或我甚至需要做的概念化是否都是关闭的(可能都是以上所述)。

1 个答案:

答案 0 :(得分:1)

正如您已经尝试过的那样,使用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

(避免使用.ix - 现在已经正式弃用。)