在一行中过滤熊猫数据框

数据挖掘 Python 熊猫 数据清理
2022-03-11 20:30:32

我在面试测试中遇到了以下数据清理问题,我一直在努力解决(我已经更改了细节以使其匿名并保护公司的面试流程)

给定以下数据框df,返回一个以索引为索引的新系列,以及一个包含当天吃饭的每个人(即第 1 天和第 3 天Alice 和 Bob,但只有第 2 天的 Alice)day所消耗的一组膳食的单列. 不要使用 for 循环或列表推导,仅使用方法链接和仅接受单个参数的单个 lambda 函数。

df = pd.DataFrame({'day':[1, 2, 3, 1, 3]*3,
                   'person':['Alice', 'Alice', 'Alice', 'Bob', 'Bob']*3,
                   'meal':['breakfast', 'breakfast', 'breakfast', 'breakfast', 'breakfast']+
                          ['lunch', 'brunch', 'brunch', 'lunch', 'lunch']+
                          ['dessert', 'dinner', 'snack', 'beer', 'dessert']
                  })

换句话说,目标是获得以下数据帧:

goal = pd.DataFrame({'day':[1, 2, 3], 
                     'meal':[{'breakfast', 'lunch'}, 
                             {'breakfast', 'brunch', 'dinner'},
                             {'breakfast'}]
                    }).set_index('day')

有谁知道如何做到这一点?谢谢!

1个回答

第一个groupby——统计每天每餐的人数

第二个groupby - 统计每天的唯一人数

2之间的内合——匹配每天的人数+餐等于当天的人数

我们留下了一个 df,其中每行包含日餐情侣,用餐人数与当天的总人数相匹配:

新的df

现在我们只需要按天分组并创建套餐

df.groupby(['day','meal']).count().reset_index()\ 
  .merge(df.groupby('day')['person'].apply(lambda x: len(set(x))).reset_index(), 
         on=['day','person'])\ 
  .groupby(['day'])['meal'].apply(set)

最后的df