【问题标题】:Changing the value of column based on conditions: Pandas根据条件更改列的值:Pandas
【发布时间】:2022-01-25 01:50:33
【问题描述】:

我有以下信息。

假设我有以下列表。

my_list = [2,3,4,5]

我的数据框如下:

df

Col1      Value
[2,3,6]    Hot
[7]        Mild
[10,11]    Cool
[5,9]      Cool
[2,5,6]    Mild

我想检查列表 my_list 中的一个值是否存在于列 Col1 中。如果存在,则将相应行的Value列中的值更改为Mild。但如果值为Hot,请保持原样。

我希望看到类似下面的内容。

Col1      Value
[2,3,6]    Hot
[7]        Mild
[10,11]    Cool
[5,9]      Mild
[2,5,6]    Mild

我只是在寻找一个简单的脚本,它可以迭代并检查每一行,并在对应行的另一列中更改一个值。

我试过了。

df["Value"] =(d["Value"].apply(lambda x: "Mild" if  len(set(x["Col1"]).intersection(my_list)) >0 
                                            and (x["Value"] != 'Hot') else x["Value"],axis=1) )                           

有人可以帮忙吗?

【问题讨论】:

    标签: pandas


    【解决方案1】:

    我们可以使用set.isdisjoint 来检查列表是否不相交,然后使用布尔索引和loc 来更新值

    m1 = df['Value'] != 'Hot'
    m2 = df['Col1'].map(set(my_list).isdisjoint)
    
    df.loc[m1 & ~m2, 'Value'] = 'Mild'
    

            Col1 Value
    0  [2, 3, 6]   Hot
    1        [7]  Mild
    2   [10, 11]  Cool
    3     [5, 9]  Mild
    4  [2, 5, 6]  Mild
    

    【讨论】:

      【解决方案2】:

      在检查Col1 值在my_list 中之前,使用mask 隐藏具有Hot 值然后explode 数据框的行:

      df.loc[df.mask(df['Value'].eq('Hot')).explode('Col1').isin(my_list)
               .groupby(level=0)['Col1'].any(), 'Value'] = 'Mild'
      print(df)
      
      # Output:
              Col1 Value
      0  [2, 3, 6]   Hot
      1        [7]  Mild
      2   [10, 11]  Cool
      3     [5, 9]  Mild
      4  [2, 5, 6]  Mild
      

      【讨论】:

        【解决方案3】:

        方法和your previous question几乎一模一样,只是改变一个条件:

        match = df['Col1'].explode().isin(my_list).groupby(level=0).any()
        df['Value'] = df['Value'].mask(match & df['Value'].ne('Hot'), 'Mild')
        

        输出:

                Col1 Value
        0  [2, 3, 6]   Hot
        1        [7]  Mild
        2   [10, 11]  Cool
        3     [5, 9]  Mild
        4  [2, 5, 6]  Mild
        

        【讨论】:

        • @Hiwot 考虑测试 Shubham 的方法,根据实际用例可能会更快
        • 不错,我试过了。因为我在 Col1 下有 NaN 值,所以它会抛出错误 TypeError: 'float' object is not iterable 但是当我用空值填充 NaN 时,它可以工作。无论如何,我使用了你的方法。
        猜你喜欢
        • 2014-10-09
        • 2020-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-20
        • 2021-09-05
        • 2022-11-30
        • 2021-03-02
        相关资源
        最近更新 更多