我有这个数据集:
text sentiment
randomstring positive
randomstring negative
randomstring netrual
random mixed
然后如果我运行countmap
,我有:
"mixed" -> 600
"positive" -> 2000
"negative" -> 3300
"netrual" -> 780
我想从这个数据集中随机抽样,这样我就有了所有smallest class (mixed = 600)
的记录和其他类别(positive=600, negative=600, neutral = 600)
的相同数量的记录
我知道如何在pandas中这样做:
df_teste = [data.loc[data.sentiment==i]
.sample(n=int(data['sentiment']
.value_counts().nsmallest(1)[0]),random_state=SEED) for i in data.sentiment.unique()]
df_teste = pd.concat(df_teste, axis=0, ignore_index=True)
但是我很难在Julia中做到这一点。
注意:我不想硬编码哪个类是最低的,所以我正在寻找一个解决方案,从countmap
或freqtable
推断,如果可能的话。
你为什么想要一个countmap
或freqtable
解决方案似乎如果你想使用一个数据帧的结束?
这就是如何使用dataframe。jl(但没有StatsBase。jl和FreqTables。Jl,因为不需要它们):
julia> using Random
julia> using DataFrames
julia> df = DataFrame(text = [randstring() for i in 1:6680],
sentiment = shuffle!([fill("mixed", 600);
fill("positive", 2000);
fill("ngative", 3300);
fill("neutral", 780)]))
6680×2 DataFrame
Row │ text sentiment
│ String String
──────┼─────────────────────
1 │ R3W1KL5b positive
2 │ uCCpNrat ngative
3 │ fwqYTCWG ngative
⋮ │ ⋮ ⋮
6678 │ UJiNrlcw ngative
6679 │ 7aiNOQ1o neutral
6680 │ mbIOIQmQ ngative
6674 rows omitted
julia> gdf = groupby(df, :sentiment);
julia> min_len = minimum(nrow, gdf)
600
julia> df_sampled = combine(gdf) do sdf
return sdf[randperm(nrow(sdf))[1:min_len], :]
end
2400×2 DataFrame
Row │ sentiment text
│ String String
──────┼─────────────────────
1 │ positive O0QsyrJZ
2 │ positive 7Vt70PSh
3 │ positive ebFd8m4o
⋮ │ ⋮ ⋮
2398 │ neutral Kq8Wi2Vv
2399 │ neutral yygOzKuC
2400 │ neutral NemZu7R3
2394 rows omitted
julia> combine(groupby(df_sampled, :sentiment), nrow)
4×2 DataFrame
Row │ sentiment nrow
│ String Int64
─────┼──────────────────
1 │ positive 600
2 │ ngative 600
3 │ mixed 600
4 │ neutral 600
如果你的数据非常大,你需要操作非常快,有更有效的方法来做到这一点,但在大多数情况下,这应该足够快,解决方案不需要任何额外的包。