首页 > 解决方案 > Pandas Groupby、过滤器和插入列

问题描述

我正在使用一个 Pandas 数据框,该数据框有一列带有代表客户的唯一 ID 代码。每个 ID 代码在表中的几行中重复出现。表中的另一列带有布尔标志,真或假。我正在尝试调整表格,以便对于每个 ID 代码,如果至少有一个标志设置为 true,它们都将设置为 true;即,您可以在 10 行中有一个客户 ID 代码,其中 9 行的标志设置为 false,但有一个设置为 true。我希望所有行现在都设置为 true。这是我尝试过的:

data=[
    {"id":"a","flag":True},
    {"id":"a","flag":True},
    {"id":"a","flag":False},
    {"id":"b","flag":False},
    {"id":"a","flag":True},
    {"id":"a","flag":True}]
df = pd.DataFrame(data)

df.groupby('id').filter(lambda x:(x['flag']==True).any())['mod_flag'] = True```

df[df['mod_flag'] != True] = False

但它在第二行抛出了一个关键错误mod_flag。任何帮助将不胜感激 - 谢谢!

编辑:

在此处添加示例数据表以获得所需的输出:

ID 旗帜 mod_flag
一个 错误的 错误的
一个 错误的 错误的
b 错误的 真的
b 错误的 真的
b 真的 真的
C 真的 真的
C 真的 真的

其中 ID = b 的行是需要更改的行。

标签: pythonpandas

解决方案


  • groupby()将所有相关行放在一起
  • transform()为每项工作获得价值
  • 简单的熊猫系列any()
df = pd.DataFrame({"client_id":np.random.randint(1,5,8),
             "flag":np.random.choice([False,True], 8)}).sort_values("client_id")

df.assign(newflag=df.groupby("client_id")["flag"].transform(lambda s: s.any()))

client_id 旗帜 新旗
3 1 真的 真的
6 1 错误的 真的
0 2 真的 真的
2 2 真的 真的
7 2 真的 真的
1 3 真的 真的
4 3 错误的 真的
5 4 错误的 错误的

推荐阅读