【问题标题】:Pandas overwrite values in column selectively based on condition from another columnPandas 根据另一列的条件选择性地覆盖列中的值
【发布时间】:2017-06-16 19:19:39
【问题描述】:

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

如果该行中的 Col C 包含子字符串“V”(区分大小写),我想将 Col 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

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

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

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

更改单个值。

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

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

【问题讨论】:

    标签: python pandas apply


    【解决方案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 - 现在已正式弃用。)

    【讨论】:

    • 谢谢!我知道我必须让这件事变得更复杂!
    猜你喜欢
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 2020-08-20
    • 1970-01-01
    • 1970-01-01
    • 2020-05-06
    • 2022-09-29
    相关资源
    最近更新 更多