簡體   English   中英

熊貓-根據日期將數據框拆分為多個數據框?

[英]Pandas - Split dataframe into multiple dataframes based on dates?

我有一個帶有多個列以及一個日期列的數據框。 日期格式為15年12月31日,我將其設置為日期時間對象。

我將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')

如果必須循環,則在對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_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的要旨中的筆記本(請參閱他的評論),但是使用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')

這是每年的拆分。

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM