【问题标题】:why is function not applying to dataframe? Series object has no attribute called query (Pandas)为什么函数不适用于数据框?系列对象没有称为查询的属性(熊猫)
【发布时间】:2020-06-28 12:47:40
【问题描述】:

我有一个数据框用户,并调用了公共列是 user_id 的地方。我需要在 churn 不为空的用户数据框中删除值并删除调用中的那些 user_id 行。

users = user_id,first_name,last_name,age,city,reg_date,plan,churn_date
1000,Anamaria,Bauer,45,"Atlanta-Sandy Springs-Roswell, GA MSA",2018-12-24,ultimate,
1001,Mickey,Wilkerson,28,"Seattle-Tacoma-Bellevue, WA MSA",2018-08-13,surf,
1002,Carlee,Hoffman,36,"Las Vegas-Henderson-Paradise, NV MSA",2018-10-21,surf,
1003,Reynaldo,Jenkins,52,"Tulsa, OK MSA",2018-01-28,surf,
1004,Leonila,Thompson,40,"Seattle-Tacoma-Bellevue, WA MSA",2018-05-23,surf,
1005,Livia,Shields,31,"Dallas-Fort Worth-Arlington, TX MSA",2018-11-29,surf,
1007,Eusebio,Welch,42,"Grand Rapids-Kentwood, MI MSA",2018-07-11,surf,
1008,Emely,Hoffman,53,"Orlando-Kissimmee-Sanford, FL MSA",2018-08-03,ultimate,
1009,Gerry,Little,19,"San Jose-Sunnyvale-Santa Clara, CA MSA",2018-04-22,surf,
1010,Wilber,Blair,52,"Dallas-Fort Worth-Arlington, TX MSA",2018-03-09,surf,
calls = id,user_id,call_date,duration
1000_93,1000,2018-12-27,8.52
1000_145,1000,2018-12-27,13.66
1000_247,1000,2018-12-27,14.48
1000_309,1000,2018-12-28,5.76
1000_380,1000,2018-12-30,4.22
1000_388,1000,2018-12-31,2.2
1000_510,1000,2018-12-27,5.75
1000_521,1000,2018-12-28,14.18
1000_530,1000,2018-12-28,5.77
1000_544,1000,2018-12-26,4.4
filter_user = users[users['churn_date'].notnull()]["user_id"].tolist()

我正在创建一个函数来使用来自 filter_user 的 user_id 列表

def new(df):
    df = df.query('user_id != @filter_user')
    return df

我想应用其他数据帧并从 filter_user 中删除包含 user_ids 的行,这就是为什么将上述函数应用于其他数据帧的原因

calls.apply(new,axis=1)

AttributeError:“系列”对象没有属性“查询” 为什么会出现这个错误?

【问题讨论】:

    标签: python pandas numpy dataframe data-science


    【解决方案1】:

    当您运行calls.apply(some_action, axis=1) 时,它会调用函数some_action 到您的数据框calls 的所有行。

    因此,您应该更改new 函数以使用pd.Series 行,或者使用其他技术过滤用户。最简单的方法是使用df.isin() 方法:

    df = df[ df.user_id.isin(filter_user ) ]
    

    df.isin用于检查DataFrame中的每个元素是否包含在values中。

    【讨论】:

    • 我需要为每个数据帧单独执行此操作吗?或者有没有更快的方法来处理数据框列表
    • 您是否有多个具有相同结构和相同 user_id 的数据帧?如果是,您可以创建函数,首先创建filter_user 列表,然后过滤数据框
    • 我有几个具有相同结构的数据框。我无法编写函数。我实际上想要一个功能。 users = users[~users.user_id.isin(filter_user)] calls = calls[~calls.user_id.isin(filter_user)] messages = messages[~messages.user_id.isin(filter_user)] internet = internet[~internet.user_id.isin(filter_user)]
    • 如果您想为每个数据帧使用相同的 filter_user,您可以编写如下内容:def filter_df (df): df = df [df.user_id.isin (filter_user)]。但是,如果您只需要过滤这些用户,则可以在没有函数的情况下完成,就像您写的那样。
    • 我写了你提到的函数,我在问题中遇到了上面提到的相同属性错误
    【解决方案2】:

    试试这个:

    users_to_remove = users.loc[users.churn_date.notnull(), 'user_id']
    filtered_calls = calls[~calls.user_id.isin(users_to_remove)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-02
      • 1970-01-01
      • 2021-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-30
      • 1970-01-01
      相关资源
      最近更新 更多