熊猫通过groupby日期的总和归一化由datetimeindex索引的列

时间:2018-12-16 23:40:55

标签: python pandas pandas-groupby

如果给定一个使用datetimeindex索引的数据框,是否有一种有效的方法可以在给定的日期内对值进行规范化?例如,我想对每一天的所有值求和,然后将每一列的值除以该天的结果总和。

我可以轻松地按日期分组并计算除数(每个日期的每一列的值的总和),但是我不完全确定将原始数据帧除以结果总和df的最佳方法。

Example dataframe with datetimeindex and resulting df from sum

我试图做类似

df / df.groupby(df.index.to_period('D')).sum()

但是它的表现却不符合我的期望。

相反,我到处都有NaN的df,并将Date添加为新索引。

Results from above division

玩具娱乐:

df = pd.DataFrame([[1,2],[3,4],[5,6],[7,8]],columns=['a','b'], 
              index=pd.to_datetime(['2017-01-01 14:30:00','2017-01-01 14:31:00', 
                                    '2017-01-02 14:30:00', '2017-01-02 14:31:00']))
df / df.groupby(df.index.to_period('D')).sum()

产生

                     a  b
2017-01-01 14:30:00 NaN NaN
2017-01-01 14:31:00 NaN NaN
2017-01-02 14:30:00 NaN NaN
2017-01-02 14:31:00 NaN NaN
2017-01-01  NaN NaN
2017-01-02  NaN NaN

1 个答案:

答案 0 :(得分:0)

您将需要将数据框复制并粘贴为文本而不是图像,因此我可以提供更多帮助,但这是一个示例:

样本df

//form.js
import '../../assets/form.scss'
export default {
    render(createElement){
        return createElement('form',{
            class:{
            form:true
        },
            attrs: {
                class:'form'
            }
        }, [
            createElement('input',{attrs: {'placeholder':'Enter url'}}),
            createElement('button', 'Submit')
        ])

然后您当前正在做什么:

df1 = pd.DataFrame(np.random.randn(5,5), columns=list('ABCDE'),
                  index=pd.date_range('2017-01-03', '2017-01-07'))

df2 = pd.DataFrame(np.random.randn(5,5), columns=list('ABCDE'),
                  index=pd.date_range('2017-01-03', '2017-01-07'))

df = pd.concat([df1,df2])

               A            B          C            D           E
2017-01-03  1.393874    1.933301    0.215026    -0.412957   -0.293925
2017-01-04  0.825777    0.315449    2.317292    -0.347617   -2.427019
2017-01-05  -0.372916   -0.931185   0.049707    0.635828    -0.774566
2017-01-06  1.564714    -1.582461   1.455403    0.521305    -2.175344
2017-01-07  1.255747    1.967338    -0.766391   -0.021921   0.672704
2017-01-03  0.620301    -1.521681   -0.352800   -1.394239   -1.206983
2017-01-04  -0.041829   -0.870871   -0.402440   0.268725    1.499321
2017-01-05  -1.098647   1.690136    1.004087    0.304037    1.235310
2017-01-06  0.305645    -0.327096   0.280591    -0.476904   1.652096
2017-01-07  1.251927    0.469697    0.047694    1.838995    -0.258889

看看第一行col A

df / df.groupby(df.index).sum() A B C D E 2017-01-03 0.692032 4.696817 -1.560723 0.228507 0.195831 2017-01-03 0.307968 -3.696817 2.560723 0.771493 0.804169 2017-01-04 1.053357 -0.567944 1.210167 4.406211 2.616174 2017-01-04 -0.053357 1.567944 -0.210167 -3.406211 -1.616174 2017-01-05 0.253415 -1.226937 0.047170 0.676510 -1.681122 2017-01-05 0.746585 2.226937 0.952830 0.323490 2.681122 2017-01-06 0.836585 0.828706 0.838369 11.740853 4.157386 2017-01-06 0.163415 0.171294 0.161631 -10.740853 -3.157386 2017-01-07 0.500762 0.807267 1.066362 -0.012064 1.625615 2017-01-07 0.499238 0.192733 -0.066362 1.012064 -0.625615 ,因此您的1.393874 / (1.393874 + 0.620301) = 0.6920322216292031示例可以正常工作。

如果您的数据包含NaN,也要小心,因为df / df.groupby(df.index).sum()

每个评论的更新:

np.nan / a number = nan