使用熊猫在字典的数据框中插入行并删除行

时间:2019-05-01 18:18:03

标签: pandas date dataframe dictionary

我有一个包含多个数据帧的字典,并且我的数据帧(示例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],
                            })

1 个答案:

答案 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)

第四部分

使用interpolategroupby来填充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