【问题标题】:data frames: apply on two columns based on values数据框:根据值应用于两列
【发布时间】:2018-10-18 10:40:46
【问题描述】:

假设我有一个简单的数据框,例如:

import pandas as pd

data = {'letters' : ['a','b','c','d','e'], 'numbers' :[1,2,3,4,5]}
df = pd.DataFrame(data)

表格如下所示
simple dataframe

现在说我有一个短名单,to_remove = ['b','d']
如何在我的数据框中找到行,其中“字母”列的值在“to_remove”中,并将“字母”和“数字”中的这一行都修改为无?所以我留下了
a 1
无无
c 3
无无
e 5

一直在寻找几个小时。谢谢!!

【问题讨论】:

    标签: python pandas dataframe multiple-columns apply


    【解决方案1】:

    使用isin 按值列表检查并通过loc 设置None

    to_remove = ['b','d']
    
    df.loc[df['letters'].isin(to_remove), ['letters','numbers']] = None
    #all columns
    #df.loc[df['letters'].isin(to_remove)] = None
    print (df)
      letters  numbers
    0       a      1.0
    1    None      NaN
    2       c      3.0
    3    None      NaN
    4       e      5.0
    

    如果想要过滤行使用boolean indexing,通过~ 反转布尔掩码:

    df1 = df.loc[~df['letters'].isin(to_remove)]
    print (df1)
      letters  numbers
    0       a        1
    2       c        3
    4       e        5
    

    【讨论】:

      【解决方案2】:

      或者可以将df.eval 用于df.loc

      df.loc[df.eval('letters in @to_remove'),['letters','numbers']]=None
      

      但既然没有,你只是列出要分配的数据框的所有列,为什么不只是:

      df.loc[df.eval('letters in @to_remove')]=None
      

      【讨论】:

        猜你喜欢
        • 2020-07-18
        • 2015-02-10
        • 1970-01-01
        • 2023-01-13
        • 1970-01-01
        • 1970-01-01
        • 2015-08-15
        • 2019-05-01
        相关资源
        最近更新 更多