Вставьте строку и удалите строки в фреймах данных в словаре, используя панд - PullRequest
1 голос
/ 01 мая 2019

У меня есть словарь, содержащий несколько фреймов данных, и мои фреймы данных (примеры df1 и df2) имеют одинаковую структуру, ключом к каждому фрейму данных в моем dict является идентификатор, представленный в фрейме данных (поэтому «AA» для df1).

У меня есть фрейм данных (data_extract), которого нет в словаре. Я хотел бы добавить дату в этом фрейме данных в фрейм данных в словаре с тем же идентификатором, а затем добавить значение и затем удалить вседаты раньше, чем в 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 Ответ

1 голос
/ 01 мая 2019

Это сложный вопрос. Я разбиваю шаги.

merge_asof, bffil, dropna, concat,sort_values,reindex,MultiIndex,groupby, interpolate

1-я часть

очистить данные, преобразовать дату в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')

2-я часть

Используя merge_asof, получитьобъединить с вашим состоянием, как это работает проверить` ссылка

Yourdf=pd.merge_asof(df,data_extract,on='date',by='id',allow_exact_matches=False)

3-я часть

Изменить результирующий фрейм данных, отбросить тедаты меньше целевой даты, обратите внимание, что я использую limit 1 в ffill, поскольку вам нужно сохранить первую строку меньше до даты

Yourdf['key']=Yourdf.groupby('id').key.bfill(limit=1)

Yourdf=Yourdf.dropna(subset=['key'])
Yourdf=pd.concat([Yourdf,data_extract],sort=False)

4-я часть

Используя 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)

5th

#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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...