从DataFrame中选择ID计数大于X的行

8
我有一个Dataframe,其中一列包含ID。这个ID代表一个人,可以出现多次:
        col_id    col2     col3     col4....
row1      1
row2      1
row3      2
row4      3
row5      3
row6      3
row7      1
row8      7

我需要返回一个新的数据框,其中ID列的value_counts大于2。
新数据框:
         col_id    col2     col3     col4....
row1      1
row2      1
row3      3
row4      3
row5      3
row6      1

这个新的数据框只包含ID计数大于2的行。

编辑

接下来我需要按ID分开数据。理想情况下,我想要一个每个ID都有一个数据框的解决方案:

数据框1

    col_id   col2    col3    col4....
r1     1
r2     1
r3     1

数据框2

    col_id   col2    col3    col4....
r1     2
r2     2
r3     2

数据框3

    col_id   col2    col3    col4....
r1     3
r2     3
r3     3

是否有可能将它们合并为一个大型数据框?这样我就可以拥有一个名为“index”的新列,其中包含ID == 1,ID == 2等行:

index
  1        col_id   col2    col3    col4....
       r1     1
       r2     1
       r3     1



index
  2       col_id   col2    col3    col4....
      r1     2
      r2     2
      r3     2


    index
       3      col_id   col2    col3    col4....
         r1     3
         r2     3
         r3     3
2个回答

12

使用GroupBy.transformGroupBy.size处理与原始DataFrame同样大小的Series,因此可以通过布尔索引进行过滤:

df = df[df.groupby('col_id')['col_id'].transform('size') > 2]
print (df)
      col_id
row1       1
row2       1
row4       3
row5       3
row6       3
row7       1

如果性能不是很重要,或者 DataFrame 很小,可以使用 DataFrameGroupBy.filter

df = df.groupby('col_id').filter(lambda x: len(x) > 2)

编辑:按col_id分离DataFrame,可以创建一个DataFrame字典:

dfs = dict(tuple(df.groupby('col_id')))
print (dfs[1])
      col_id
row1       1
row2       1
row7       1

print (dfs[2])
      col_id
row3       2

print (dfs[3])
      col_id
row4       3
row5       3
row6       3

可能有一种使用全局变量而非 Pythonic 的解决方案,但不建议使用(仅供娱乐):

for i, df in df.groupby('col_id'):
    globals()['df{}'.format(i)] =  df

print (df1)
      col_id
row1       1
row2       1
row7       1

非常感谢!有没有一种方法可以为每个ID返回唯一的数据帧?因此,返回ID == 1的单个数据帧,然后返回ID == 2等? - Mazz
它关闭了。我希望数据框可以通过一个名为“index”的新列连接在一起。 - Mazz
@Muzz - 在样本数据中,数字 7 的索引是 4 还是 7?如果是 7,你需要使用 df = pd.concat(dfs) 还是 df = df.sort_values('col_id') - jezrael
让我们在聊天室里继续这个讨论 - Mazz

2
如果您想继续使用value_counts()方法,请遵循以下步骤 -
# Creating a dictionary using value_counts()
items = df.col_id.value_counts().to_dict().items()

# Filtering only those rows where duplicate entries occur more than n
n = 2
df = df[df.col_id.isin([key for key, val in items if val > n])]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接