按条件删除组



假设我有以下数据帧

using DataFrames
df = DataFrame(A = 1:10, B = ["a","a","b","b","b","c","c","c","c","d"])
grouped_df  = groupby(df, "B")

有四个基团。如何删除行数少于2行的组?例如:只保留abc组。我可以用for循环很容易地做到这一点,但我不认为这是最佳的方式。

如果您希望结果仍然分组,那么filter是最简单的:

julia> filter(x -> nrow(x) > 1, grouped_df)
GroupedDataFrame with 3 groups based on key: B
First Group (2 rows): B = "a"
Row │ A      B
│ Int64  String
─────┼───────────────
1 │     1  a
2 │     2  a
⋮
Last Group (4 rows): B = "c"
Row │ A      B
│ Int64  String
─────┼───────────────
1 │     6  c
2 │     7  c
3 │     8  c
4 │     9  c

如果你想获得一个数据帧作为一个操作的结果,然后做例如:

julia> combine(grouped_df, x -> nrow(x) < 2 ? DataFrame() : x)
9×2 DataFrame
Row │ B       A
│ String  Int64
─────┼───────────────
1 │ a           1
2 │ a           2
3 │ b           3
4 │ b           4
5 │ b           5
6 │ c           6
7 │ c           7
8 │ c           8
9 │ c           9

我认为一个更好的方法是使用子集:

subset(grouped_df, :B => x -> length(x) >= 2)

如果您想保留组,那么只需设置ungroup = false。您还可以通过设置view = true来避免combine执行的复制,或者使用子集!.

就地执行操作。

最新更新