为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Pandas 中的条件计算多列中每个组的唯一值

使用 Pandas 中的条件计算多列中每个组的唯一值

萧十郎 2023-07-11 16:57:23
更新了示例数据集我有以下数据:location ID  ValueA        1   1 A        1   1A        1   1 A        1   1A        1   2 A        1   2A        1   2 A        1   2A        1   3 A        1   4 A        2   1 A        2   2 A        3   1 A        3   2B        4   1 B        4   2 B        5   1B        5   1 B        5   2B        5   2 B        6   1 B        6   1B        6   1B        6   1 B        6   1B        6   2B        6   2B        6   2   B        7   1 我想计算每个位置和以下输出的每个 ID 的唯一值(仅当值等于 1 或 2 时)。location ID_Count  Value_CountA        3         6B        4         7我尝试使用df.groupby(['location'])['ID','value'].nunique(),但我只得到唯一的值计数,就像我得到 A 的 value_count 为 4,B 的 value_count 为 2。
查看完整描述

4 回答

?
猛跑小猪

TA贡献1858条经验 获得超8个赞

尝试对值agg进行切片。IDTrue


对于更新的示例,您只需在处理之前删除重复项即可。其余的都一样


df = df.drop_duplicates(['location', 'ID', 'Value'])


df_agg = (df.Value.isin([1,2]).groupby(df.location)

                              .agg(ID_count=lambda x: df.loc[x[x].index, 'ID'].nunique(), 

                                   Value_count='sum'))


Out[93]:

          ID_count  Value_count

location

A                3            6

B                4            7


查看完整回答
反对 回复 2023-07-11
?
饮歌长啸

TA贡献1951条经验 获得超3个赞

与 anky 大致相同,但随后使用Series.whereandnamed aggregations因此我们可以在 groupby 中创建列时重命名列。


grp = df.assign(Value=df['Value'].where(df['Value'].isin([1, 2]))).groupby('location')

grp.agg(

    ID_count=('ID', 'nunique'),

    Value_count=('Value', 'count')

).reset_index()

  location  ID_count  Value_count

0        A         3            6

1        B         4            7


查看完整回答
反对 回复 2023-07-11
?
千巷猫影

TA贡献1829条经验 获得超7个赞

让我们尝试使用与其他答案非常相似的方法。这次我们先过滤:


(df[df['Value'].isin([1,2])]

   .groupby(['location'],as_index=False)

   .agg({'ID':'nunique', 'Value':'size'})

)

输出:


  location  ID  Value

0        A   3      6

1        B   4      7


查看完整回答
反对 回复 2023-07-11
?
12345678_0001

TA贡献1802条经验 获得超5个赞

IIUC,你可以尝试series.isin一下groupby.agg


out = (df.assign(Value_Count=df['Value'].isin([1,2])).groupby("location",as_index=False)

                                   .agg({"ID":'nunique',"Value_Count":'sum'}))

print(out)


  location  ID  Value_Count

0        A   3          6.0

1        B   4          7.0


查看完整回答
反对 回复 2023-07-11
  • 4 回答
  • 0 关注
  • 142 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信