【问题标题】:Pandas groupby with lambda and in the listPandas groupby 与 lambda 并在列表中
【发布时间】:2019-02-15 09:32:50
【问题描述】:

我有以下数据框

df = pd.DataFrame({'ItemType': ['Red', 'White', 'Red', 'Blue', 'White', 'White', 'White', 'Green'], 
               'ItemPrice': [10, 11, 12, 13, 14, 15, 16, 17], 
               'ItemID': ['A', 'A', 'B', 'B', 'C', 'C', 'D', 'D']})

我想以 DataFrame 的形式获取 ItemID 仅包含“白色”ItemType 的记录(行)

我尝试了以下解决方案:

types = ['Red','Blue','Green']

~df.groupby('ItemID')['ItemType'].any().apply(lambda u: u in(types))

但这给了我一个不正确的结果(D 应该是 False)并且是一个系列的形式。

A False
B False
C True
D True

谢谢!

【问题讨论】:

    标签: python pandas list lambda pandas-groupby


    【解决方案1】:

    另一种方法是计算一组非白色ItemID 值。然后过滤你的数据框:

    non_whites = df.loc[df['ItemType'].ne('White'), 'ItemID'].unique()
    
    res = df[~df['ItemID'].isin(non_whites)]
    
    print(res)
    
      ItemType  ItemPrice ItemID
    4    White         14      C
    5    White         15      C
    

    您也可以使用GroupBy,但这不是绝对必要的。

    【讨论】:

    • 谢谢!这也有效。我以前从未使用过 dataframe.ne。有趣的解决方案。
    【解决方案2】:

    您应该避免在此处使用 apply,因为它通常很慢。相反,在groupby 之前分配一个flag 列,然后使用all 断言types 中没有任何组值:

    df.assign(flag=~df.ItemType.isin(types)).groupby('ItemID').flag.all()
    

    ItemID
    A    False
    B    False
    C     True
    D    False
    Name: flag, dtype: bool
    

    但是,只是为了演示操作的逻辑,并说明您的方法有哪些不正确之处,这里是一个使用 apply 的工作版本:

    ~df.groupby('ItemID').ItemType.apply(lambda x: any(i in types for i in x))
    

    您需要在 lambda 中使用any,而不是在系列上使用apply


    要访问满足此条件的行,您可以使用transform

    df[df.assign(flag=~df.ItemType.isin(types)).groupby('ItemID').flag.transform('all')]
    

      ItemType  ItemPrice ItemID
    4    White         14      C
    5    White         15      C
    

    【讨论】:

    • 太棒了!有没有办法以 Dataframe 的形式获得结果,只有该检查为 True 的行?通常我必须将 Series 更改为 Dataframe,然后在列上与原始 Dataframe 进行外部合并。然后从该数据框中选择此检查等于 True 的行。我想知道是否有更优雅的解决方案。谢谢!
    • 不错!谢谢!
    猜你喜欢
    • 2023-03-23
    • 1970-01-01
    • 2019-05-24
    • 2016-06-07
    • 2017-08-06
    • 2015-12-15
    • 2019-04-04
    • 2019-09-06
    • 1970-01-01
    相关资源
    最近更新 更多