Pandas 数据帧中的程序合并

Pandas 数据帧中的程序合并,pandas,Pandas,使用熊猫进行回归 样本数据: from datetime import datetime import pandas as pd data = {'date': ['2014-05-01', '2014-05-02', '2014-05-03', '2014-05-04', '2014-05-05', '2014-05-06', '2014-05-07', '2014-05-08', '2014-05-09', '2014-05-10','2014-05-11', '2014-05-12', '

使用熊猫进行回归

样本数据:

from datetime import datetime
import pandas as pd
data = {'date': ['2014-05-01', '2014-05-02', '2014-05-03', '2014-05-04', '2014-05-05', '2014-05-06', '2014-05-07', '2014-05-08', '2014-05-09', '2014-05-10','2014-05-11', '2014-05-12', '2014-05-13', '2014-05-14', '2014-05-15', '2014-05-16', '2014-05-17', '2014-05-18', '2014-05-19', '2014-05-20'], 
    'height_in_cm': [134, 135, 135, 137, 138, 140, 140, 141, 142, 143, 143, 144, 145, 146, 147, 148, 149, 150, 150, 151], 'participant_id': [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}
df = pd.DataFrame(data, columns = ['date', 'height_in_cm', 'participant_id'])
因此,我们有多个参与者,一年中每天都要测量身高。这项研究的子部分是找出一年中不同月份的身高增长情况。因此,我们需要在每月的第一天测量身高,并将其与另外3周开始时的数据相结合。所以,上面显示的数据的输出应该如下所示。如何在熊猫身上进行这样的合并。。。有线索吗

data_required = {'ini_date': ['2014-05-01','2014-05-01'], 
    'height_in_cm': [134, 134], 'participant_id': [1,1], 'future_date': ['2014-05-08','2014-05-15'],'future_height': [141, 147], 'week': [2, 3]}

new_df = pd.DataFrame(data_required, columns = ['ini_date', 'height_in_cm', 'participant_id','future_date','future_height', 'week'])

最初的起点是将日期转换为日期时间,并将频率更改为每周

df = df.set_index(pd.to_datetime(df.date))
df = df.asfreq('W-THU') #This corresponds to your first day of the week

df['Week'] = df.index.week - df.index[0].week
df = pd.DataFrame(df.iloc[0]).transpose().reset_index().merge(df.iloc[1:], on='participant_id', suffixes=('', '_future'))

del df['index']; del df['Week'] #Removing redundant columns
更新

关于你的问题是,你使用一个月的第一天作为起点,然后将其转换为7天/14天的周期,所有这些都是在时间戳中完成的,而不是在周期中完成的

import pandas as pd

df.date = pd.to_datetime(df.date)
df['y-m'] = df.date.dt.strftime('%Y-%m') #To make sure you track growth month to month
MonthStart = pd.date_range('2014-01-01', freq='MS', periods=100) #Generation for the first day of the month

mask = df.date.isin(MonthStart.shift(1, '7D')) | df.date.isin(MonthStart.shift(2, '7D'))
df[df.date.isin(MonthStart)].merge(df[mask], on=['participant_id', 'y-m'], suffixes=('', '_future')).drop('y-m', axis=1)
解释

  • 您将为每月的第一天生成一个列表
  • 您创建了1周和2周的轮班
  • 过滤月初并将其与班次合并
  • 最好在等式中加入月份标识符,这样你就不会将四月的事件与六月的事件进行匹配
输出


日期
高度(单位:厘米)
参与者id
日期与未来
未来的高度
0
2014-05-01
134
1.
2014-05-08
141
1.
2014-05-01
134
1.
2014-05-15
147

如果可以确保每个数据帧都有一个参与者(
pd.groupby
),我首先将日期从字符串转换为实际时间对象(
pd.to_datetime
),然后将其作为数据帧索引。这将使您可以轻松地获取从月初开始的行,并使用时间算术将一周、两周、三周相加。这将假定周四是月初一天。但是,正如我所写的,我们有1年的数据,所以每个月的起始日期都不一样。无论如何,谢谢。@XingfangLee我相应地更新了我的答案,请检查并让我知道。谢谢你的帮助。