我试图将按月的数据集转换为每周,但是为了实现这一目标,我将数据集分解为每日,然后将其汇总为周。在进行汇总时(通过groupby),我无法将数据细分为每日级别。
Month_End_Date A B C D
2/28/2019 Pikachu Starter 100000 5302
2/28/2019 Jolteon Evolution 250000 7935
3/31/2019 Charmander Starter 62810 5103
3/31/2019 Bulbasaur Starter 16868 6035
4/30/2019 Flareon Evolution 62810 5103
4/30/2019 Eevee Starter 16868 6035
5/31/2019 Glaceon Evolution 62810 5103
5/31/2019 Leafeon Evolution 16868 6035
6/30/2019 Umbreon Evolution 62810 5103
6/30/2019 Espeon Evolution 16868 6035
我正在尝试将第一行说成
Month_End_Date A B C D
2/1/2019 Pikachu Starter 3571.428571 189.3571429
2/2/2019 Pikachu Starter 3571.428571 189.3571429
2/3/2019 Pikachu Starter 3571.428571 189.3571429
2/4/2019 Pikachu Starter 3571.428571 189.3571429
2/5/2019 Pikachu Starter 3571.428571 189.3571429
其中每日价值除以28(因为2月为28天)
我搜索了ffill
,但无法完全解决问题
答案 0 :(得分:2)
首先通过DataFrame.drop_duplicates
删除每列Month_End_Date
的重复项,然后通过向前填充缺失值并最后每月/每年仅过滤28
行来过滤DataFrame.resample
:
#convert column to datetimes and then to first day of month
df['Month_End_Date'] = (pd.to_datetime(df['Month_End_Date'], format='%m/%d/%Y')
.dt.to_period('m').dt.to_timestamp())
df = df.drop_duplicates('Month_End_Date').set_index('Month_End_Date')
#for duplicated last row of data
df.loc[df.index[-1] + pd.offsets.MonthEnd(1)] = df.iloc[-1]
df = df.resample('d').ffill()
df1 = df[df.groupby(df.index.to_period('m')).cumcount() < 28]
print (df1.tail())
A B C D
Month_End_Date
2019-06-24 Umbreon Evolution 62810 5103
2019-06-25 Umbreon Evolution 62810 5103
2019-06-26 Umbreon Evolution 62810 5103
2019-06-27 Umbreon Evolution 62810 5103
2019-06-28 Umbreon Evolution 62810 5103
如果需要所有值,不仅每个组的第一个计数器都使用GroupBy.cumcount
和resample
的{{1}}链创建计数器:
groupby