将DataFrame拆分为多列组的字典

时间:2017-08-24 21:40:03

标签: python pandas dictionary dataframe group-by

我有一个这样的数据框:

     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]
        })

如何拆分数据框以获取二维字典数据帧
每年和每季度的[年] [季]。

现在我可以按如下方式编写一维字典:

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

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

这样我获得了dataframe mc [2015],mc [2016]等字典 然后我再次对每个人都应用相同的东西。

我希望修改代码:

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

一次创建一个二维(甚至多维字典),允许更快地分割数据。

2 个答案:

答案 0 :(得分:2)

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

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)

答案 1 :(得分:2)

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