我有一个这样的数据框:
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}
一次创建一个二维(甚至多维字典),允许更快地分割数据。
答案 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