【问题标题】:alternative way of filtering dataframe过滤数据框的替代方法
【发布时间】:2021-09-19 03:01:39
【问题描述】:

社区!这是一个很长的解释,但一个“简单”的问题!我有以下df:

d = {'name': ['john', 'mary', 'james'], 'area':[['IT', 'Resources', 'Admin'], ['Software', 'ITS', 'Programming'], ['Teaching', 'Research', 'KS']]}
df = pd.DataFrame(data=d)


我的目标是从“区域”列中过滤长度大于 3 的单词。所以,它看起来像:


我学会了两种方法来处理这种情况:

  1. df['area']=df['area'].map(lambda x: [e for e in x if len(e)>3])

  2. 定义 g(x):

     return [e for e in x if len(e)>3]
    
     df['area']=df['area'].map(g)
    

在这两种情况下,它都有效。


在学习方面,我正在处理这种情况,但不使用 lambda 函数,而是遍历行,然后应用 func。

这就是我得到的

所需的输出不一样。谁能告诉我在我的代码中需要做什么才能获得所需的输出?

我非常感谢迄今为止我收到的所有支持!谢谢!!

【问题讨论】:

  • 您将提前返回函数中的第一个匹配元素。相反,您应该创建一个列表,将满足条件的元素附加到列表并返回该列表。
  • return e 退出函数,因此只返回第一次出现len(e) > 3

标签: python pandas function loops


【解决方案1】:

问题是您返回的第一个元素长于 3。试试这个:

def f(x):
    answer = []
    for e in x:
        if len(e)>3:
            answer.append(e)
    return answer

但更好的是,尝试一种更 Python 的方式:

def f(x):
    return [e for e in x if len(e)>3]

【讨论】:

    【解决方案2】:

    pandas 作为一些.str 方法,您可以使用一种是.str.len()

    首先你需要分解你的数据框,这样我们就可以对整个 df 应用一个操作,而不是迭代每个元素。

    df1 = df.explode('area')
    
    df1[df1['area'].str.len() > 3]\
                .groupby('name',as_index=False)\
                .agg(list)
    

       name                     area
    0  james     [Teaching, Research]
    1   john       [Resources, Admin]
    2   mary  [Software, Programming]
    

    【讨论】:

    • 嗨,奥马尔!非常感谢您的回复!!我不知道我可以像你展示的那样接近!我将学到更多关于 .str 方法的知识!谢谢!!!
    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 2017-11-10
    • 2011-08-17
    • 2014-04-24
    • 1970-01-01
    相关资源
    最近更新 更多