按pandas Dataframe 分组,而不丢失列multiindex

ufj5ltwl  于 2023-06-28  发布在  其他
关注(0)|答案(2)|浏览(144)

我有一个带有多索引列的df,看起来像这样:

A          | B          | ...
bins | ... | bins | ... | ...

我有这样的代码来获得每对“bin”的出现次数:
bin_sizes = df.groupby([(A, 'bins'), (B, 'bins')], as_index=False, group_keys=False).size()
我的问题是,结果dataframe的列不是多索引的,我需要它们与原始dataframe相同。
我尝试了groupby中的参数as_index=Falsegroup_keys=False,但没有按预期工作
下面是一个例子:

# Dataframe with two level index columns
df = pd.DataFrame({('A', 'a'): [5,3,2], ('A', 'b'): [8,2,5], ('A', 'bins'): [1,1,2], ('B', 'a'): [5,3,2], ('B', 'b'): [8,2,5], ('B', 'bins'): [1,1,2]}, index=[0,1,2])
# df.columns.nlevels = 2
b = df.groupby([('A', 'bins'), ('B', 'bins')], group_keys=False, as_index=False).size()
# b.columns.nlevels = 1

背景:
目的是然后针对'A'的每个二进制数获得具有更多出现的'B'的对应二进制数。所以我可以用这些成对的箱子来过滤我的原始 Dataframe 。这个想法是使用内部合并,但'它是不允许之间的不同级别'

idx = bin_sizes.groupby(('A', 'bins'))['size'].idxmax()
bins = bin_sizes.loc[idx]
merged = pd.merge(df, bins, on=[('A', 'bins'), ('B', 'bins')])
qjp7pelc

qjp7pelc1#

IIUC,以下是其中一个选项:

bins = df.xs("bins", level=1, axis=1)
size = bins.groupby(["A", "B"]).size()

out = df.loc[bins.agg(tuple, axis=1) == size.idxmax()]

输出:

print(out)

   A          B        
   a  b bins  a  b bins
0  5  8    1  5  8    1
1  3  2    1  3  2    1
6qfn3psc

6qfn3psc2#

最后,我成功地制作了我想要的过滤器,在某种程度上感谢@Timeles的回答,就像这样:

bins = df.xs('bins', level=1, axis=1).groupby(['A', 'B'], as_index=False).size()

bins = bins.loc[bins.groupby('A')['size'].idxmax()]

df = df.loc[df[[('A', 'bins'), ('B', 'bins')]].agg(tuple, axis=1).isin(bins[['A', 'B']].agg(tuple, axis=1))]

但职位本身的问题还没有解决。

相关问题