Python 选择在每次重复中满足条件的ID
我想从列ID中选择已完成的唯一元素。每个ID代表一个任务,可以出现多次。只有当“状态”列的每行值为100时,任务才会完成。 数据集示例: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出现两
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
对于一个非唯一字段来说似乎是一个令人困惑的名称。。。