【问题标题】:Split DataFrame into a dictionary of groups from multiple columns将 DataFrame 拆分为来自多列的组字典
【发布时间】:2018-02-02 21:48:29
【问题描述】:

我有一个这样的数据框:

     df = pd.DataFrame({
               'Client':['A','B','C','D','E'],  
               'Revenue':[100,120,50,40,30],  
               'FYoQ':['FY','Q','Q','Q','FY'],  
              'Quarter':[np.nan,1,3,4,np.nan],  
              'Year':[2017,2016,2015,2017,2016]
        })

如何拆分数据框以获得二维字典数据框
ds[year][quarter] 表示每年和每季度。

现在我可以按如下方式制作一维字典:

   years=df['Year'].unique().tolist()  
   mc={elem:pd.DataFrame for elem in years}  

  for year in years:  
      mc[year]=df.loc[(df['Year']==year)]  

这样我获得了数据框 mc[2015]、mc[2016] 等的字典。
然后我必须再次对他们每个人应用相同的东西。

我希望对代码进行修改:

  mc={elem:pd.DataFrame for elem in years}  

一次创建一个二维(甚至是多维字典),从而可以更快地拆分数据。

【问题讨论】:

    标签: python pandas dictionary dataframe group-by


    【解决方案1】:
    from collections import defaultdict
    
    d = defaultdict(dict)
    [d[y].setdefault(q, g) for (y, q), g in df.groupby(['Year', 'Quarter'])];
    d = dict(d)
    
    for y, v in d.items():
        print(y)
        for q, s in v.items():
            print('    ' + str(q))
            p = s.__repr__()
            p = '\n'.join(['        ' + l for l in p.split('\n')])
            print(p, '\n')
    
    2015
        3.0
              Client FYoQ  Quarter  Revenue  Year
            2      C    Q      3.0       50  2015 
    
    2016
        1.0
              Client FYoQ  Quarter  Revenue  Year
            1      B    Q      1.0      120  2016 
    
    2017
        4.0
              Client FYoQ  Quarter  Revenue  Year
            3      D    Q      4.0       40  2017 
    

    【讨论】:

    • 作为使用说明(给 OP):单级字典比需要两次单独查找的嵌套字典更便于访问。
    • 同意!但是OP确实要求二维。我认为这是 OP 要求的。你的就是 OP 需要的。
    • 谢谢,让我试试这个。看起来你们都同意,另一种解决方案更好/更快。
    【解决方案2】:

    IIUC,您可以使用df.set_index 设置多索引,然后调用df.groupby。然后,在 dict 理解中构建您的字典:

    dict_ = {i : g for i, g in df.set_index(['Year', 'Quarter']).groupby(level=[0, 1])}
    
    for k in dict_:
        print(dict_[k])
    
                 Client FYoQ  Revenue
    Year Quarter                     
    2016 1.0          B    Q      120
    
    
                 Client FYoQ  Revenue
    Year Quarter                     
    2015 3.0          C    Q       50
    
    
                 Client FYoQ  Revenue
    Year Quarter                     
    2017 4.0          D    Q       40
    

    键是(year, quarter) 元组,非常易于管理。


    要保存到 CSV 文件,最后一个循环需要一个 .to_csv 调用:

    for k in dict_:
        label = 'data{}Q{}'.format(map(str, k))
        dict_[k].to_csv(label)
    

    【讨论】:

    • 谢谢,让我试试看。
    • 谢谢这确实有效。我想知道如何修改最后一个 for 循环,以便我可以编写 pd.to_csv 各种生成的文件,这些文件会自动获得名称,如“data2015Q1.csv”、“data2015Q2.csv”、....、“data2016Q4. csv"...
    • @AlhpaDelta 已编辑。你需要.to_csv
    • 它给出了一个错误“IndexError:tuple index out of range”。到目前为止效果很好(谢谢!)。如果我能把它写回来,那就完美了,实际数据是几年零四个季度。
    猜你喜欢
    • 2022-01-03
    • 2020-04-23
    • 2011-05-04
    • 2020-11-10
    • 2017-01-07
    • 1970-01-01
    • 2022-12-29
    相关资源
    最近更新 更多