【发布时间】:2019-12-01 01:42:40
【问题描述】:
我是 python 和 pandas 的新手,并且有一些关于如何编写一个短函数的基本问题,该函数接受一个 pd.Dataframe 并返回按月份分组的相对值。
示例数据:
import pandas as pd
from datetime import datetime
import numpy as np
date_rng = pd.date_range(start='2019-01-01', end='2019-03-31', freq='D')
df = pd.DataFrame(date_rng, columns=['date'])
df['value_in_question'] = np.random.randint(0,100,size=(len(date_rng)))
df.set_index('date',inplace=True)
df.head()
value_in_question
date
2019-01-01 40
2019-01-02 86
2019-01-03 46
2019-01-04 75
2019-01-05 35
def absolute_to_relative(df):
"""
set_index before using
"""
return df.div(df.sum(), axis=1).mul(100)
relative_df = absolute_to_relative(df)
relative_df.head()
value_in_question
date
2019-01-01 0.895055
2019-01-02 1.924368
2019-01-03 1.029313
2019-01-04 1.678228
2019-01-05 0.783173
而不是取列总和然后除以每一行, 我想每个月都有总和 groupby 。最终的 df 应该具有相同的 形状和形式,但行值与月份总和有关。
旧:
value_in_question
date
"2019-01-01" value/colum_sum * 100
新:
value_in_question
date
"2019-01-01" value/month_sum * 100
所以我尝试了以下方法,它为 value_in_question 返回 NA:
def absolute_to_relative_agg(df, agg):
"""
set_index before using
"""
return df.div(df.groupby([pd.Grouper(freq=agg)]).sum(), axis=1)
relative_df = absolute_to_relative(df, 'M')
value_in_question
date
2019-01-01 NaN
2019-01-02 NaN
2019-01-03 NaN
2019-01-04 NaN
2019-01-05 NaN
【问题讨论】:
标签: python pandas pandas-groupby