Python 将一列中最频繁的项目与另一列中最频繁的项目关联起来

Python 将一列中最频繁的项目与另一列中最频繁的项目关联起来,python,pandas,group-by,Python,Pandas,Group By,在下面的数据框中,我想在“第一”列中找到两个最频繁的组,并在每个组中的“第二”列中找到两个最频繁的组 df=pd.DataFrame({'first':list('cbbccabc'),'second':list('zvzwyzyxxwz')) df 得到 通过df.groupby(['first']).size() first a 1 b 5 c 6 first second a x 1 b v 2 w

在下面的数据框中,我想在“第一”列中找到两个最频繁的组,并在每个组中的“第二”列中找到两个最频繁的组

df=pd.DataFrame({'first':list('cbbccabc'),'second':list('zvzwyzyxxwz'))
df
得到

通过
df.groupby(['first']).size()

first
a    1
b    5
c    6
first  second
a      x         1
b      v         2
       w         2
       z         1
c      x         1
       y         2
       z         3
因此,“c”和“b”是“第一”列中最常见的项目。我们希望在“c”组和“b”组的“第二”列中列出两个最常见的项目。如果我们执行df.groupby(['first','second']).size()我们得到

first
a    1
b    5
c    6
first  second
a      x         1
b      v         2
       w         2
       z         1
c      x         1
       y         2
       z         3
因此,我们感兴趣的是‘c’中的‘z’和‘y’,以及‘b’中的‘v’和‘w’,即

first  second
c      z         3
       y         2
b      v         2
       w         2

我认为这是一种可能的用途,因为默认情况下,按计数排序-首先是过滤的top2值,过滤的数据帧,然后是按
idx
值的更改顺序返回的top2每组:

注意-不需要按
m
进行筛选,但为了获得更好的性能而添加了筛选(只处理2组,而不是全部)

3个级别的解决方案:

df = pd.DataFrame({'second': list('cbbcbcbccabc'),
                   'third': list('zvvzwyzyxxwz')})

#3 column df
df = (pd.concat([df, df], keys=('a','b'))
        .reset_index(level=1, drop=True)
        .rename_axis('first')
        .reset_index())
# print (df)


idx = df['first'].value_counts().head(2).index
m = df['first'].isin(idx)
idx1 = (df[m].groupby(['first'])['second']
            .apply(lambda x: x.value_counts().iloc[:2])
            .index)
print (idx1)

df = df.set_index(['first','second'])
df = (df.loc[idx1].groupby(['first','second'], sort=False)['third']
        .apply(lambda x: x.value_counts().iloc[:2])
        .rename_axis(['first','second','third']))
           
print (df)
first  second  third
a      c       z        3
               y        2
       b       w        2
               v        2
b      c       z        3
               y        2
       b       w        2
               v        2
Name: third, dtype: int64

如果我们想将解决方案扩展到“第三”列怎么办?@Morteza-它意味着第一级为top2,第一、第二级为top2,第一、第二、第三级为top2?你能给问题添加一些数据样本吗?前两列的相同内容将扩展到第三列。所以,还有一个维度。@Morteza-不太容易,添加了一些解决方案。