【问题标题】:DataFrame: N largest indexes values (from level=1) to n columnsDataFrame:N个最大索引值(从级别= 1)到n列
【发布时间】:2018-10-26 08:14:27
【问题描述】:

我正在尝试转换这样的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']})

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

我的做法:

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

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

现在,我知道的唯一转换 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) 的顺序。

【问题讨论】:

    标签: python pandas dataframe group-by multi-index


    【解决方案1】:

    虽然@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')
    

    【讨论】:

      【解决方案2】:

      使用SeriesGroupBy.value_counts,默认情况下按headDataFrame构造函数选择前2个索引值:

      a = df.groupby('A')['B'].apply(lambda x: x.value_counts().head(2).index.tolist())
      print (a)
      A
      A1    [B1, B3]
      A2    [B7, B8]
      Name: B, dtype: object
      

      如果想使用您的代码:

      df = df.groupby(['A', 'B'])['A'].count()
      df = df.groupby(level=0).nlargest(2).reset_index(level=0, drop=True)
      
      df = df.rename('C').reset_index().groupby('A')['B'].apply(list)
      print (df)
      A
      A1    [B1, B2]
      A2    [B7, B8]
      Name: B, dtype: object
      

      df1 = (pd.DataFrame(a.values.tolist(), index=a.index)
               .rename(columns=lambda x: x+1)
               .add_suffix('_nlargest'))
      print (df1)
         1_nlargest 2_nlargest
      A                       
      A1         B1         B3
      A2         B7         B8
      

      【讨论】:

        猜你喜欢
        • 2019-02-17
        • 2021-12-21
        • 2022-01-25
        • 1970-01-01
        • 2021-05-17
        • 2022-01-26
        • 2022-06-13
        • 2022-01-12
        • 2017-09-25
        相关资源
        最近更新 更多