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

Python 选择在每次重复中满足条件的ID,python,pandas,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出现两

我想从列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出现两次。完成了一项任务
  • 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_completed=df[df['Status']==100]。删除重复项()

df_filtered=df[df.ID.isin(df_completed.ID)&(df.Status考虑到变量是一种状态,我假设它以独占方式存在[0100]?如果是这样,该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

考虑到变量是一种状态,我假设它只存在[0100]?如果是这样,该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

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

这似乎是
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
有很多方法可以做到这一点

选项1

groupby()
并过滤掉
min==100

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

ID  Status
0  A     100
1  C     100
选项2 使用
groupby()
过滤器(布尔选择)

使用反向
.isin
查询排除所选索引,并从结果中删除重复项

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
有很多方法可以做到这一点

选项1

groupby()
并过滤掉
min==100

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

ID  Status
0  A     100
1  C     100
选项2 使用
groupby()
过滤器(布尔选择)

使用反向
.isin
查询排除所选索引,并从结果中删除重复项

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

ID
对于一个非唯一字段来说似乎是一个令人困惑的名称…
ID
对于一个非唯一字段来说似乎是一个令人困惑的名称。。。