我有一个带有多索引列的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=False
和group_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')])
2条答案
按热度按时间qjp7pelc1#
IIUC,以下是其中一个选项:
输出:
6qfn3psc2#
最后,我成功地制作了我想要的过滤器,在某种程度上感谢@Timeles的回答,就像这样:
但职位本身的问题还没有解决。