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

时间:2020-09-21 20:39:05

标签: python pandas

我想从列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很大,因此简单和高效是最受欢迎的。

3 个答案:

答案 0 :(得分:1)

考虑变量是一种状态,我假设它专门存在[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

答案 1 :(得分:1)

这似乎是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

答案 2 :(得分:1)

许多方法。

选项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的{​​{1}},并使用100index

提取其groupby()

使用反向filter(boolean selection)查询和.isin从结果中排除所选索引

drop duplicates