python - DataFrame:N 个最大索引值(从 level=1)到 n 列

标签 python pandas dataframe group-by multi-index

我正在尝试转换这样的 df:

df = pd.DataFrame({'A': ['A1', 'A1', 'A1', 'A1', 'A1', 'A1', 'A2', 'A2', 'A2', 'A2', 'A2', 'A2', 'A2'],
      'B': ['B1', 'B1', 'B2', 'B2', 'B3', 'B3', 'B4', 'B5', 'B6', 'B7', 'B7', 'B8', 'B8']})

enter image description here

通过取n个(这里是2)最大索引(按B的计数)来:

enter image description here

我的做法:

df = df.groupby(['A', 'B'])['A'].count()
df = df.groupby(level=0).nlargest(2).reset_index(level=0, drop=True)

什么给了我(这接近我需要的):

enter image description here

现在,我知道转换 MultiIndex 的唯一方法是:

df.reset_index(level=1)
df.unstack()

但他们没有给我我想要的东西。有没有任何数据框方法可以为我做这件事,或者我需要用 apply 来做这件事。一种方法是循环遍历每一对:df.index.get_level_values(level=1)并将其放入新的 2 列 df 中。但这会破坏如果一个index.level=0,将只有一个index.level=1

另外:当计数相同时,我不关心 (nlargest) 的顺序。

最佳答案

虽然@jezrael的答案更快更容易(我会使用它),但这就是我在研究它时开发的:

df = pd.DataFrame({'A': ['A1', 'A1', 'A1', 'A1', 'A1', 'A1', 'A2', 'A2', 'A2', 'A2', 'A2', 'A2', 'A2'],
      'B': ['B1', 'B1', 'B2', 'B2', 'B3', 'B3', 'B4', 'B5', 'B6', 'B7', 'B7', 'B8', 'B8']})

df = df.groupby(['A', 'B'])['A'].count()
df = df.groupby(level=0).nlargest(2).reset_index(level=0, drop=True)
df = df.unstack()

df_new = pd.DataFrame(columns=['A', '1_Largest', '2_largest'])

for i, row in enumerate(['A1', 'A2']):
    df_new.loc[i, :] = row
    df_new.loc[i, '1_Largest'] = df.loc[row].sort_values(ascending=False).index[0]
    df_new.loc[i, '2_largest'] = df.loc[row].sort_values(ascending=False).index[1]

df_new.set_index('A')

关于python - DataFrame:N 个最大索引值(从 level=1)到 n 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50368090/

相关文章:

python - 为 Pandas 数据框中的两列创建邻接矩阵

python - 分组并填充缺失的日期时间值

r - 是否可以合并 R data.frame 中的行?

python - 将 DataFrame 中的嵌入字典列表展开为 DataFrame 的新列

python - 右对齐python

python - gobject.MainLoop 和 tornado.IOLoop 一次?

python - 如何优化这个与字符串反转相关的函数?

python - 替换python中二维列表中的项目

python - pandas dataframe上的for-if循环语句操作问题

Python 大学名称和缩写以及网络链接