我有一个具有200万行的数据框,其格式如下:
ID Number
1 30
1 40
1 60
2 10
2 30
3 60
我需要选择编号为30和40的ID(在这种情况下,输出应为1)。
我知道我们可以创建一个仅包含数字30和40的新DF,然后使用groupby来查看哪些ID的数量大于1。但是,有没有办法在groupby语句中同时做这两项呢?
我的代码:
a=df[(df['Number']==30) | (df['Number']==40) ]
b=a.groupby('ID')['Number'].nunique().to_frame(name='tt').reset_index()
b[b['tt'] > 1]
答案 0 :(得分:2)
使用分组依据filter
和issubset
s = {30, 40}
df.groupby('ID').filter(lambda x: s.issubset(set(x.Number)))
Out[158]:
ID Number
0 1 30
1 1 40
2 1 60
答案 1 :(得分:1)
我将为每个条件创建一个df,然后将它们内部连接:
df1 = df[df.Number == 30][['Number']]
df2 = df[df.Number == 40][['Number']]
df3 = df1.join(df2,how='inner',on='Number')
答案 2 :(得分:1)
我发现Groupby对象的describe()
方法返回一个数据帧的事实非常有用。
将temp1 = a.groupby("ID").describe()
和temp2 = a.groupby("ID").describe()["Number"]
输出到Jupyter笔记本以查看它们的外观,然后下面的代码(从您的代码开始)应该有意义。
summary = a.groupby("ID").describe()["Number"]
summary.loc[summary["count"] > 1].index