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-不太容易,添加了一些解决方案。