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

在每次重复中选择满足条件的 ID

在每次重复中选择满足条件的 ID

郎朗坤 2023-08-22 17:49:58
我想从列 ID 中选择那些已完成的唯一元素。每个ID代表一个任务并且可以出现多次。仅当状态列每行的值为 100 时,任务才完成。数据集示例:import pandas as pddf = pd.DataFrame(data= {'ID': ['A', 'A', 'B', 'B', 'C', 'D'], 'Status': [100, 100, 100, 25, 100, 34]})预期结果:  ID  Status0  A     1004  C     100A:出现两次,100。A完成B:出现两次,但其中一次是 25。B 不完整C:以100出现一次。C完成D:与34一起出现一次。D不完整。这是我到目前为止的工作:df_completed = df[df['Status']==100].drop_duplicates()df_filtered = df[df.ID.isin(df_completed.ID) & (df.Status<100)]df_completed = df_completed[~df_completed.ID.isin(df_filtered.ID)]正如您所看到的,我能够产生正确的结果,但我想知道是否有一种不太复杂的方法来做到这一点。而且代码是要共享的,df又大,简单高效是最受欢迎的。
查看完整描述

3 回答

?
侃侃尔雅

TA贡献1801条经验 获得超15个赞

这似乎是一个很好的用例groupby。这里有几个例子:


df.groupby("ID").apply(lambda df: (df.Status == 100).all())


这给出了每个 ID 的布尔状态:


ID

A     True

B    False

C     True

D    False

如果可以依赖平均值,则另一种选择:


df.groupby("ID").mean().pipe(lambda df: df[df.Status == 100])


这给出了结果:


ID  Status

A   100.0

C   100.0


查看完整回答
反对 回复 2023-08-22
?
皈依舞

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

有很多方法可以做到。


选项1


groupby()并过滤掉min==100


df.groupby('ID')['Status'].min()[lambda x:x==100].reset_index()


ID  Status

0  A     100

1  C     100

选项 2 过滤IDs任何Status不等于100并index使用提取它们groupby(),filter(boolean selection)


.isin使用反向查询drop duplicates从结果中排除选定的索引


s=df.loc[df.groupby('ID')['Status'].filter(lambda x:(x!=100).any()).index,:]

df[~df.index.isin(s.index)].drop_duplicates()



   ID  Status

0  A     100

4  C     100


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

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

考虑到变量是一种状态,我假设它只存在于 [0,100]?如果是这样,该 ID 的最低状态必须为 100。


import pandas as pd

df = pd.DataFrame(data= {'ID': ['A', 'A', 'B', 'B', 'C', 'D'], 'Status': [100, 100, 100, 25, 100, 34]})

df_completed=df.groupby(['ID']).min()==100 #gives True/False for each ID.

df_completed=df_completed[df == True].dropna()*100 #essentially just formatting

输出:


    Status

ID

A    100.0

C    100.0


查看完整回答
反对 回复 2023-08-22
  • 3 回答
  • 0 关注
  • 130 浏览
慕课专栏
更多

添加回答

举报

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