猿问

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

我想从列 ID 中选择那些已完成的唯一元素。每个ID代表一个任务并且可以出现多次。仅当状态列每行的值为 100 时,任务才完成。数据集示例:


import pandas as pd

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

预期结果:


  ID  Status

0  A     100

4  C     100

  • A:出现两次,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又大,简单高效是最受欢迎的。


郎朗坤
浏览 182回答 3
3回答

侃侃尔雅

这似乎是一个很好的用例groupby。这里有几个例子:df.groupby("ID").apply(lambda df: (df.Status == 100).all())这给出了每个 ID 的布尔状态:IDA&nbsp; &nbsp; &nbsp;TrueB&nbsp; &nbsp; FalseC&nbsp; &nbsp; &nbsp;TrueD&nbsp; &nbsp; False如果可以依赖平均值,则另一种选择:df.groupby("ID").mean().pipe(lambda df: df[df.Status == 100])这给出了结果:ID&nbsp; StatusA&nbsp; &nbsp;100.0C&nbsp; &nbsp;100.0

皈依舞

有很多方法可以做到。选项1groupby()并过滤掉min==100df.groupby('ID')['Status'].min()[lambda x:x==100].reset_index()ID&nbsp; Status0&nbsp; A&nbsp; &nbsp; &nbsp;1001&nbsp; C&nbsp; &nbsp; &nbsp;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()&nbsp; &nbsp;ID&nbsp; Status0&nbsp; A&nbsp; &nbsp; &nbsp;1004&nbsp; C&nbsp; &nbsp; &nbsp;100

饮歌长啸

考虑到变量是一种状态,我假设它只存在于 [0,100]?如果是这样,该 ID 的最低状态必须为 100。import pandas as pddf = 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输出:&nbsp; &nbsp; StatusIDA&nbsp; &nbsp; 100.0C&nbsp; &nbsp; 100.0
随时随地看视频慕课网APP

相关分类

Python
我要回答