根据df.groupby中的值对类别进行分组

时间:2020-05-27 08:33:04

标签: python pandas dataframe

我想再次将来自df.groupby的分组数据分组。在数据框上,我通过对语言列进行计数来对语言列进行分组。下面是我的代码:

grouped = df_covid_qua.groupby('LANG')['ID'].count()

grouped数据可以正常工作。以下是其输出:

LANG
ar       2
en     631
es      10
et       1
fr       8
hi      22
in       5
it       1
ja       1
kn       5
ko       3
mr       1
nl       1
pa       1
ta       3
te       1
th       2
tl       1
tr       2
uk       1
und     31
ur       6

我将以上数据用于条形图。我的问题是,语言类别过多,因此我决定根据其输出再次对类别进行分组。我的预期输出是这样的:

LANG
en     631
und    31
hi     22
es     10
fr     8
LANG A 5
LANG B 3
LANG C 2
LANG D 1

类别LANG A,B,C和D是我要分组的语言,因为它们具有与较早的groupby数据相似的计数值。我研究了小组申请和合并的技巧,但不确定是否适用于我的问题。

我真的是Python新手,可以提供任何帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

使用:

s = df_covid_qua.groupby('LANG')['ID'].count()

#first sort output
s = s.sort_values(ascending=False)

#specify how many last unique values is replaced
N = 4
#remove duplicates and get last smallest values with swap order of values
v = s.drop_duplicates().nsmallest(N).iloc[::-1]

#generate LANG A,B,C dynalically by length
import string
a = string.ascii_uppercase

d = {y: f'LANG {x}' for x, y in zip(a, v)}
print (d)

#create new Series with map by langs
new = pd.Series(v.to_numpy(), index=v.map(d))

#filter values out of smallest and join new Series
out = pd.concat([s[~s.isin(v)], new])
print (out)

en        631
und        31
hi         22
es         10
fr          8
ur          6
LANG A      5
LANG B      3
LANG C      2
LANG D      1
dtype: int64