我想从列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
这是我到目前为止的工作:
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很大,因此简单和高效是最受欢迎的。
答案 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}},并使用100
,index
groupby()
使用反向filter(boolean selection)
查询和.isin
从结果中排除所选索引
drop duplicates