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
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
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
添加回答
举报