Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python数据操作:使用日期复制和平均行和列值_Python_Pandas_Data Manipulation_Data Cleaning - Fatal编程技术网

Python数据操作:使用日期复制和平均行和列值

Python数据操作:使用日期复制和平均行和列值,python,pandas,data-manipulation,data-cleaning,Python,Pandas,Data Manipulation,Data Cleaning,嗨,我有一个以下格式的数据集: 用于复制数据的代码: import pandas as pd d1 = {'Year': ['2008','2008','2008','2008','2008','2008','2008','2008','2008','2008'], 'Month':['1','1','2','6','7','8','8','11','12','12'], 'Day':['6','22','6','18','3','10','14','6','16','24'], 'Su

嗨,我有一个以下格式的数据集:

用于复制数据的代码:

import pandas as pd
d1 = {'Year': 
['2008','2008','2008','2008','2008','2008','2008','2008','2008','2008'],
  'Month':['1','1','2','6','7','8','8','11','12','12'],
'Day':['6','22','6','18','3','10','14','6','16','24'],
'Subject_A':['','30','','','','35','','','',''],
'Subject_B':['','','','','','','','40','',''],
'Subject_C': ['','','','','','65','','50','','']}
d1 = pd.DataFrame(d1)
我以字符串形式输入数字以显示空白单元格

其中前三列表示日期(年、月和日),下面几列表示个人(我的实际数据文件由大约300行这样的行和大约1000个主题组成。我在这里展示了数据的子集)

其中,列值指快速消费品产品的支出。 我想做的是:

第1部分(起点和终点)

a) 对于每个人,确定第一次观察的位置,并至少在前六个月复制第一次观察的值。例如:受试者C的第一次观察是在2008年8月10日。在这种情况下,我希望2008年6月10日的所有行对于主题C等于65(大约为2/12/2008) 是截止日期。因此,我们将顶部的第三个单元格留空,以供主题(C)列使用

b) 找到最后一次观察,并在接下来的3个月内重复最后一次观察。例如,对于主题A,我们重复35次(直到2008年11月6日)

请参考下图,了解带解决方案的突出显示单元格

第二部分-(中间的行)

接下来我想做两件事(我需要分别完成以下三个步骤,而不是一次完成所有步骤):

对于像受试者A这样的个体,找到两个依次出现的观察结果(30和35)

i) 使用两次观察的平均值。在这种情况下,我们将在四行中使用32.5,而不考虑时间

例如:

ii)找出两次观察之间的总时间,并取时间的平均值。对于时间段的前半部分,指定第一个值,对于后半部分,指定第二个值。例如,对于受试者1,208年1月22日至2008年8月10日之间的总天数为201天。对于前201/2=100.5天,将30的值分配给受试者_A,对于剩余的值分配给35。在这种情况下,Subject_A和Subject_C的列将如下所示:

最终数据集将使用(a)、(b)和(i)或(a)、(b)和(ii)

最终数据I[使用a、b和I]

最终数据二[使用a、b和II]

我将非常感谢您的帮助。提前谢谢。如果步骤不清楚,请告诉我

跟进问题和问题

谢谢@Juan的初步回答。这是我的后续问题。假设受试者_A有2个以上的观察结果(下面的示例数据代码)。我们是否能够扩展此代码以包含2个以上的观察结果

import pandas as pd
d1 = {'Year': 
['2008','2008','2008','2008','2008','2008','2008','2008','2008','2008'],
  'Month':['1','1','2','6','7','8','8','11','12','12'],
'Day':['6','22','6','18','3','10','14','6','16','24'],
'Subject_A':['','30','','45','','35','','','',''],
'Subject_B':['','','','','','','','40','',''],
'Subject_C': ['','','','','','65','','50','','']}
d1 = pd.DataFrame(d1)
问题 对于当前代码,我发现第二部分(II)存在一个问题。这是我得到的输出:


这实际上是在正确的轨道上。35以上的两个单元格似乎没有更新。我这边有什么问题吗?同样的问题与之前一样,我们是否能够将其扩展到>2个观察值的情况?

这里是主题a的代码解决方案。应该与其他主题一起使用:

import pandas as pd
d1 = {'Year': 
['2008','2008','2008','2008','2008','2008','2008','2008','2008','2008'],
  'Month':['1','1','2','6','7','8','8','11','12','12'],
'Day':['6','22','6','18','3','10','14','6','16','24'],
'Subject_A':['','30','','45','','35','','','',''],
'Subject_B':['','','','','','','','40','',''],
'Subject_C': ['','','','','','65','','50','','']}
d1 = pd.DataFrame(d1)
d1 = {'Year': 
['2008','2008','2008','2008','2008','2008','2008','2008','2008','2008'],
  'Month':['1','1','2','6','7','8','8','11','12','12'],
'Day':['6','22','6','18','3','10','14','6','16','24'],
'Subject_A':['','30','','45','','35','','','',''],
'Subject_B':['','','','','','','','40','',''],
'Subject_C': ['','','','','','65','','50','','']}
d1 = pd.DataFrame(d1)
d1 = pd.DataFrame(d1)
## Create a variable named date
d1['date']= pd.to_datetime(d1['Year']+'/'+d1['Month']+'/'+d1['Day'])
# convert to float, to calculate mean
d1['Subject_A'] = d1['Subject_A'].replace('',np.nan).astype(float)
# index of the not null rows
subja = d1['Subject_A'].notnull()

### max and min index row with notnull value
max_id_subja = d1.loc[subja,'date'].idxmax()
min_id_subja = d1.loc[subja,'date'].idxmin()
### max and min date for Sub A with notnull value
max_date_subja = d1.loc[subja,'date'].max()
min_date_subja = d1.loc[subja,'date'].min()
### value for max and min date
max_val_subja = d1.loc[max_id_subja,'Subject_A']
min_val_subja = d1.loc[min_id_subja,'Subject_A']
#### Cutoffs
min_cutoff = min_date_subja-pd.Timedelta(6, unit='M')
max_cutoff = max_date_subja+pd.Timedelta(3, unit='M')

## PART I.a
d1.loc[(d1['date']<min_date_subja) & (d1['date']>min_cutoff),'Subject_A'] = min_val_subja
## PART I.b
d1.loc[(d1['date']>max_date_subja) & (d1['date']<max_cutoff),'Subject_A'] = max_val_subja
## PART II
d1_2i = d1.copy()
d1_2ii = d1.copy()

lower_date = min_date_subja
lower_val = min_val_subja.copy()
next_dates_index = d1_2i.loc[(d1['date']>min_date_subja) & subja].index
for N in next_dates_index:
    next_date = d1_2i.loc[N,'date']
    next_val =  d1_2i.loc[N,'Subject_A']
    #PART II.i
    d1_2i.loc[(d1['date']>lower_date) & (d1['date']<next_date),'Subject_A'] = np.mean([lower_val,next_val])
    #PART II.ii
    mean_time_a = pd.Timedelta((next_date-lower_date).days/2, unit='d')
    d1_2ii.loc[(d1['date']>lower_date) & (d1['date']<=lower_date+mean_time_a),'Subject_A'] = lower_val
    d1_2ii.loc[(d1['date']>lower_date+mean_time_a) & (d1['date']<=next_date),'Subject_A'] = next_val
    lower_date = next_date
    lower_val = next_val
print(d1_2i)
print(d1_2ii)
d1={'Year':
['2008','2008','2008','2008','2008','2008','2008','2008','2008','2008'],
‘月份’:[‘1’、‘1’、‘2’、‘6’、‘7’、‘8’、‘8’、‘11’、‘12’、‘12’],
"Day":[6,"22","6","18","3","10","14","6",
“受试者A:[”,“30”,“45”,“35”,“35”,“30”,“45”,“45”,“35”,“35”,“35”,“30”,“45”,“45”,“35”,“35”,“35”,“35”,“35”,“35”,“30”,“45”,“45”,“45”,“35”,“35”,“35”,“35”,“35”,“35”,“35”,“35”,“35”,“35”,“35”,“35”,“35”,“35”,“35,
'主题B':['','','','','','','','','','','','','',40','','','','',
'主题C':['','','','','','','65','','','50','','','',']}
d1=pd.数据帧(d1)
d1=pd.数据帧(d1)
##创建一个名为date的变量
d1['date']=pd.to_datetime(d1['Year']+'/'+d1['Month']+'/'+d1['Day']))
#转换为浮点,以计算平均值
d1['Subject_A']=d1['Subject_A'].替换('',np.nan).类型(float)
#非空行的索引
Subject=d1['Subject_A'].notnull()
###具有notnull值的最大和最小索引行
max_id_subka=d1.loc[subka,'date'].idxmax()
min_id_subka=d1.loc[subka,'date'].idxmin()
###具有notnull值的子A的最大和最小日期
max_date_subka=d1.loc[subka,'date'].max()
min_date_subka=d1.loc[subka,'date'].min()
###最大和最小日期的值
max_val_subva=d1.loc[max_id_subva,'Subject_A']
min_val_Subka=d1.loc[min_id_Subka,'Subject_A']
####截止线
最小截止时间=最小日期时间增量(6,单位为M)
最大截止时间=最大截止日期+局部时间增量(3,单位为M)
##第一部分a
d1.loc[(d1[“日期”]最低截止日期),“受试者”]=最低受试者
##第一部分b
d1.loc[(d1[“日期”]>最大日期和(d1[“日期”]最小日期和主题)。索引
对于下一个索引中的N:
下一个日期=d1\U 2i.loc[N,'date']
next_val=d1_2i.loc[N,'Subject_A']
#第II.i部

首被告2 i.loc[(首被告[‘日期’]>下限日期)和(首被告[‘日期’]下限日期)和(首被告[‘日期’]下限日期+平均时间)和(首被告[‘日期’我认为最好将此问题分为三个问题,并将每个问题单独提出。我意识到这可能是一个很长的问题。我在这里提出未来的问题时会记住这一点。我很抱歉。我应该为每个部分分别提问题。谢谢@Juan。代码非常适合第一部分(a)和第二部分。但是,对于第2部分(i),当前设置在有两个观测值时工作。我相信这是因为当前代码使用最大值和最小值。如果有两个以上的观测值,您能提供帮助吗?此外,代码对于第2部分(ii)也不能完全工作。我将在原始问题中附上结果和后续问题,因为我无法在此处附上jpg。再次非常感谢。我编辑了答案以包含2个以上的观察结果,但仅在主题a中进行了测试。效果非常好。我在几个不同的专栏中进行了测试。非常感谢。@Juan