我有一个包含多个数据帧的字典,并且我的数据帧(示例df1和df2)具有相同的结构,我字典中每个数据帧的关键是数据帧中的ID(因此df1为'AA')。
我有一个数据框(data_extract),不在字典中,我想将该数据框中的日期添加到具有相同ID的字典中的数据框中,然后添加一个值,然后删除该日期之前的所有日期data_extract中的一个。最后,我想要df1_bis和df2_bis之类的东西。
我当时正在考虑使用concat,但是我不确定这是最好的主意,因为在我的脚本中,我需要删除一些行,并且我认为修改每个数据框更加有效且合乎逻辑。对于我考虑使用日历日的日期,但是我又不知道这是否是一个好主意以及如何使用。
a = pd.concat(mydict.values(), ignore_index=True)
df1 = pd.DataFrame({'id': ['AA', 'AA','AA', 'AA','AA'],
'date' : ['01/01/2015', '07/01/2015','19/01/2015', '01/02/2015','08/02/2015'],
'value' : [7,9,1,6,7],
'date_y' : [1,7,19,32,39]
})
df2 = pd.DataFrame({'id': ['BB', 'BB','BB', 'BB','BB'],
'date' : ['09/01/2015', '17/01/2015','19/02/2015', '01/03/2015','08/03/2015'],
'value' : [8,9,9,6,17],
'date_y' : [9,17,50,60,67],
})
data_extract = pd.DataFrame({'id': ['AA', 'BB'],
'date' : ['03/02/2015', '01/02/2015']
})
df1_bis = pd.DataFrame({'id': ['AA', 'AA','AA'],
'date' : ['01/02/2015','03/02/2015','08/02/2015'],
'value' : [6,'something',7],
'date_y' : [32,34 ,39]
})
df2_bis = pd.DataFrame({'id': ['BB', 'BB','BB', 'BB','BB'],
'date' : ['17/01/2015', '01/02/2015','19/02/2015', '01/03/2015','08/03/2015'],
'value' : [9,'something',9,6,17],
'date_y' : [17,32, 50,60,67],
})
答案 0 :(得分:1)
这是一个很难的问题..我分解了步骤。
merge_asof, bffil, dropna, concat,sort_values,reindex,MultiIndex,groupby, interpolate
第一部分
清除数据,将日期转换为datetime
格式,然后对值(sort_values
)进行排序,以供将来合并
df1.date=pd.to_datetime(df1.date,dayfirst=True)
data_extract.date=pd.to_datetime(data_extract.date,dayfirst=True)
df2.date=pd.to_datetime(df2.date,dayfirst=True)
data_extract=data_extract.assign(key=1).sort_values('date')
df=pd.concat([df1,df2]).sort_values('date')
第二部分
使用merge_asof
与您的条件合并,检查其工作原理link
Yourdf=pd.merge_asof(df,data_extract,on='date',by='id',allow_exact_matches=False)
第三部分
修改结果数据框,删除那些小于目标日期的日期,请注意我正在limit
中使用ffill
1,因为您需要保留该日期之前的第一行
Yourdf['key']=Yourdf.groupby('id').key.bfill(limit=1)
Yourdf=Yourdf.dropna(subset=['key'])
Yourdf=pd.concat([Yourdf,data_extract],sort=False)
第四部分
使用interpolate
和groupby
来填充date_y
中缺少的值,作为data_extract
中的值
idx=pd.MultiIndex.from_arrays([Yourdf.id,Yourdf.date])
Yourdf['date_y']=Yourdf.groupby('id').apply(lambda x : x.set_index('date').date_y.interpolate('index')).reindex(idx).values
Yourdf['value'].fillna('something',inplace=True)
Yourdf.sort_values(['id','date'],inplace=True)
Yourdf.drop('key',1,inplace=True)
第五名
#check the result
Yourdf
Out[1036]:
id date value date_y
5 AA 2015-02-01 6 32.0
0 AA 2015-02-03 something 34.0
6 AA 2015-02-08 7 39.0
3 BB 2015-01-17 9 17.0
1 BB 2015-02-01 something 32.0
7 BB 2015-02-19 9 50.0
8 BB 2015-03-01 6 60.0
9 BB 2015-03-08 17 67.0