【问题标题】:pandas create multiple dataframes based on duplicate index dataframepandas 根据重复的索引数据框创建多个数据框
【发布时间】:2019-05-23 08:56:29
【问题描述】:

如果我有一个索引中有重复的数据框,我将如何创建一组索引中没有重复的数据框?

更准确地说,给定数据框:

   a  b
1  1  6
1  2  7
2  3  8
2  4  9
2  5  0

我想要一个数据框列表作为输出:

   a  b
1  1  6
2  3  8


   a  b
1  2  7
2  4  9


   a  b
2  5  0

这需要根据重复的数量扩展到尽可能多的数据帧。

【问题讨论】:

    标签: python python-3.x pandas dataframe


    【解决方案1】:
    df=df.reset_index()
    dfs=[]
    while not df.empty:
        dfs.append(df[~df.duplicated('index',keep='first')].set_index('index'))
        df=df[df.duplicated('index',keep='first')]
    
    #dfs will have all your dataframes
    

    【讨论】:

      【解决方案2】:

      GroupBy.cumcount 用于自定义组,然后将组转换为字典:

      df = dict(tuple(df.groupby(df.groupby(level=0).cumcount())))
      print (df)
      {0:    a  b
      1  1  6
      2  3  8, 1:    a  b
      1  2  7
      2  4  9, 2:    a  b
      2  5  0}
      
      print (dfs[0])
         a  b
      1  1  6
      2  3  8
      

      或转换为 DataFrame 列表:

      dfs = [x for i, x in df.groupby(df.groupby(level=0).cumcount())]
      print (dfs)
      [   a  b
      1  1  6
      2  3  8,    a  b
      1  2  7
      2  4  9,    a  b
      2  5  0]
      

      【讨论】:

      • 谢谢!这是一个很好的解决方案
      【解决方案3】:

      另一种方法是使用pd.DataFrame.groupby.nth

      import numpy as np
      
      g = df.groupby(df.index)
      cnt = np.bincount(df.index).max()
      dfs = [g.nth(i) for i in range(cnt)]
      

      输出:

      [  a  b
      1  1  6
      2  3  8,    
         a  b
      1  2  7
      2  4  9,
         a  b
      2  5  0]
      

      【讨论】:

      • 谢谢!被接受,因为它会立即自动将索引和输出排序为列表:P
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-22
      • 2020-02-22
      • 2016-06-01
      • 2023-03-20
      • 1970-01-01
      • 2021-02-24
      相关资源
      最近更新 更多