Pandas 将一个数据框拆分为多个数据框

5
我有一个pandas数据框,需要将其拆分为多个数据框。我需要拆分的数据框数量取决于我有多少个月的数据,即我需要为每个月创建一个新的数据框。 因此,df:
MONTH   NAME INCOME
201801   A     100$
201801   B      20$
201802   A      30$

我需要创建两个数据框。问题是我不知道未来会有多少个月的数据。如何做到这一点?

3个回答

7
你可以使用groupby来创建一个数据帧的字典,
df['MONTH'] = pd.to_datetime(df['MONTH'], format = '%Y%m')
dfs = dict(tuple(df.groupby(df['MONTH'].dt.month)))
dfs[1]


    MONTH   NAME    INCOME
0   2018-01-01  A   100$
1   2018-01-01  B   20$

如果你的数据跨越多年,你需要在分组中包含年份。

dfs = dict(tuple(df.groupby([df['MONTH'].dt.year,df['MONTH'].dt.month])))
dfs[(2018, 1)]

    MONTH      NAME INCOME
0   2018-01-01  A   100$
1   2018-01-01  B   20$

4
我喜欢你的 dict(tuple(groupby...). 加一!我会把它添加到我的工具箱中。 - Scott Boston
谢谢。尽管指定了格式 =“%Y%m”,但为什么MONTH从201801更改为2018-01-01? - Victor
1
@Victor,Pandas会创建Ymd格式的日期,如果日期组件缺失,它将添加01作为日期。 - Vaishali

3
你可以使用 groupby 将数据框拆分为数据框列表或数据框字典:
数据框字典:
dict_of_dfs = {}
for n, g in df.groupby(df['MONTH']):
    dict_of_dfs[n] = g

数据框列表:

list_of_dfs = []
for _, g in df.groupby(df['MONTH']):
    list_of_dfs.append(g)

或者像@BenMares建议的那样使用理解:

dict_of_dfs = {

    month: group_df 

    for month, group_df in df.groupby('MONTH') 

}


list_of_dfs = [

    group_df 

    for _, group_df in df.groupby('MONTH')

]

1
使用推导式会更加优雅!{index: group_df for index, group_df in df.groupby('MONTH')} - Ben Mares
同意字典推导。不错,@BenMares。 - Scott Boston

2
您可以这样使用本地变量字典vars():
for m in df['MONTH'].unique():
    temp = 'df_{}'.format(m)    
    vars()[temp] = df[df['MONTH']==m]

每个DataFrame都是以df_month命名创建的。例如:df_201801
    MONTH   NAME    INCOME
0   201801  A   100$
1   201801  B   20$

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接