#pandas
#панды #pandas
Вопрос:
У меня есть DF с ежемесячными данными A amp; B для набора имен. Как мне расширить этот DF до еженедельного DF (конец недели), используя те же данные?
import pandas as pd
df = pd.DataFrame({
'A' : np.random.randn(6),
'B' : np.random.randn(6),
'Date' : ['2019-02-28', '2019-02-28','2019-02-28','2019-03-29','2019-03-
29','2019-03-29'],
'Name' :['jack','henry','phil','phil','henry','jack']
})
df.set_index(['Date','Name'])
Ответ №1:
Сначала преобразуйте ‘Date’ в объект datetime :
date=pd.to_datetime(df['Date'])
df['Date']=date
Затем установите DF с ‘Датой’ в качестве индекса :
df=df.set_index(['Date'])
И используйте groupby() и resample() с помощью pad(), чтобы выполнить повторную выборку :
df.groupby('Name').resample('W-FRI').pad()
это работает!
Ответ №2:
Попробуйте:
# align Date to weekends
# if Date is already index, reset index first
df.Date = df.Date pd.to_timedelta(6-df.Date.dt.dayofweek, unit='d')
# set_index
df.set_index(['Date', 'Name'], inplace=True)
# groupby and interpolate
# drop `interpolate()` if you want to fill the new dates with something else
df.groupby(level=1).apply(lambda x: x.reset_index(level=1)
.drop('Name', axis=1).asfreq('W')
.interpolate())
Вывод:
------- ------------ ----------- -----------
| | | A | B |
------- ------------ ----------- -----------
| name | date | | |
------- ------------ ----------- -----------
| henry | 2019-03-03 | -0.775991 | -0.370060 |
| | 2019-03-10 | -0.583608 | 0.001735 |
| | 2019-03-17 | -0.391225 | 0.373531 |
| | 2019-03-24 | -0.198842 | 0.745326 |
| | 2019-03-31 | -0.006460 | 1.117122 |
| jack | 2019-03-03 | 0.529327 | -0.317801 |
| | 2019-03-10 | -0.011261 | 0.336492 |
| | 2019-03-17 | -0.551850 | 0.990785 |
| | 2019-03-24 | -1.092438 | 1.645078 |
| | 2019-03-31 | -1.633027 | 2.299371 |
| phil | 2019-03-03 | 0.319571 | 0.282131 |
| | 2019-03-10 | 0.190124 | 0.027607 |
| | 2019-03-17 | 0.060676 | -0.226918 |
| | 2019-03-24 | -0.068771 | -0.481442 |
| | 2019-03-31 | -0.198218 | -0.735966 |
------- ------------ ----------- -----------