Pandas - 根据日期将数据框拆分为多个数据框?

Posted

技术标签:

【中文标题】Pandas - 根据日期将数据框拆分为多个数据框?【英文标题】:Pandas - Split dataframe into multiple dataframes based on dates? 【发布时间】:2016-06-24 18:17:35 【问题描述】:

我有一个包含多个列和一个日期列的数据框。日期格式为 12/31/15,我已将其设置为日期时间对象。

我将 datetime 列设置为索引,并希望对数据框的每个月执行回归计算。

我相信执行此操作的方法是根据月份将数据框拆分为多个数据框,存储到数据框列表中,然后对列表中的每个数据框执行回归。

我使用 groupby 成功地按月拆分数据帧,但不确定如何正确地将 groupby 对象中的每个组转换为数据帧,以便能够在其上运行我的回归函数。

有谁知道如何根据日期将一个数据框拆分为多个数据框,或者更好地解决我的问题?

这是我目前编写的代码

import pandas as pd
import numpy as np
import statsmodels.api as sm
from patsy import dmatrices

df = pd.read_csv('data.csv')
df['date'] = pd.to_datetime(df['date'], format='%Y%m%d')
df = df.set_index('date')

# Group dataframe on index by month and year 
# Groupby works, but dmatrices does not 
for df_group in df.groupby(pd.TimeGrouper("M")):
    y,X = dmatrices('value1 ~ value2 + value3', data=df_group,      
    return_type='dataframe')

【问题讨论】:

你可以使用df.groupby(...).apply。无需循环。我没有时间打出完整的答案。这是我制作的笔记本,演示了类似的内容:gist.github.com/phobson/… 【参考方案1】:

如果必须循环,则需要在迭代 groupby 对象时解包密钥和数据框:

import pandas as pd
import numpy as np
import statsmodels.api as sm
from patsy import dmatrices

df = pd.read_csv('data.csv')
df['date'] = pd.to_datetime(df['date'], format='%Y%m%d')
df = df.set_index('date')

注意这里使用group_name

for group_name, df_group in df.groupby(pd.Grouper(freq='M')):
    y,X = dmatrices('value1 ~ value2 + value3', data=df_group,      
    return_type='dataframe')

如果您想避免迭代,请查看Paul H's gist 中的笔记本(请参阅他的评论),但使用apply 的简单示例如下:

def do_regression(df_group, ret='outcome'):
    """Apply the function to each group in the data and return one result."""
    y,X = dmatrices('value1 ~ value2 + value3',
                    data=df_group,      
                    return_type='dataframe')
    if ret == 'outcome':
        return y
    else:
        return X

outcome = df.groupby(pd.Grouper(freq='M')).apply(do_regression, ret='outcome')

【讨论】:

这正是我昨天使用“group_name”所做的。感谢您的评论。 pd.TimeGrouper() 在 pandas v0.21.0 中是 formally deprecated 支持 pd.Grouper()(参见 this question)。【参考方案2】:

这是每年一次的拆分。

import pandas as pd
import dateutil.parser
dfile = 'rg_unificado.csv'
df = pd.read_csv(dfile, sep='|', quotechar='"', encoding='latin-1')
df['FECHA'] = df['FECHA'].apply(lambda x: dateutil.parser.parse(x)) 
#http://pandas.pydata.org/pandas-docs/stable/timeseries.html#offset-aliases
#use to_period
per = df['FECHA'].dt.to_period("Y")
#group by that period
agg = df.groupby([per])
for year, group in agg:
    #this simple save the data
    datep =  str(year).replace('-', '')
    filename = '%s_%s.csv' % (dfile.replace('.csv', ''), datep)
    group.to_csv(filename, sep='|', quotechar='"', encoding='latin-1', index=False, header=True)

【讨论】:

以上是关于Pandas - 根据日期将数据框拆分为多个数据框?的主要内容,如果未能解决你的问题,请参考以下文章

根据日期将数据框拆分为两个

根据日期拆分数据框

将不同类型的 CSV 字符串加载到 Pandas 数据框中,拆分列,解析日期

根据列中的一组参数将数据框拆分为多个数据框

pandas 将多个数据框合并并更新为一列

Pandas 数据框:如何按多值列将一行拆分为多行? [复制]