假设我有以下数据帧
using DataFrames
df = DataFrame(A = 1:10, B = ["a","a","b","b","b","c","c","c","c","d"])
grouped_df = groupby(df, "B")
有四个基团。如何删除行数少于2行的组?例如:只保留a
、b
、c
组。我可以用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
执行的复制,或者使用子集!.