【问题标题】:How to divide a daily sum of one column by the daily sum of another column in a Python Pandas dataframe?如何将一列的每日总和除以 Python Pandas 数据框中另一列的每日总和?
【发布时间】:2015-02-13 10:27:39
【问题描述】:

我有一个带有日期索引和 3 列数据的 pandas 数据框。

如何计算“C”列的每日总和除以“A”列的每日总和并将其写入新列 (D)?

 Index               A   B    C
2014-01-01 00:15:00  10  9   90    
2014-01-01 00:30:00  11  8   88 
2014-01-01 00:45:00  12  7   84
2014-01-01 01:00:00  13  6   78 
2014-01-01 01:15:00  14  5   70 
2014-01-01 01:30:00  15  4   60 
2014-01-01 01:45:00  16  3   48 
2014-01-01 02:00:00  17  2   34 
2014-01-01 02:15:00  18  1   18 
2014-01-01 02:30:00  19  0    0
2014-01-01 02:45:00  20  1   20 
2014-01-01 03:00:00  21  2   42
...

非常感谢您的帮助。

【问题讨论】:

    标签: python-2.7 pandas calculated-columns operation


    【解决方案1】:

    我能想到的唯一方法就是分组然后重新合并。 我修改了您示例中的某些日期,以便分组依据不同的日期。

    import pandas as pd
    
    Dict = {'Dates':['2014-01-01 00:15:00','2014-01-01 00:30:00',
            '2014-01-01 00:45:00','2014-01-02 01:00:00',
            '2014-01-02 01:15:00','2014-01-03 01:30:00',
            '2014-01-03 01:45:00','2014-01-03 02:00:00',
            '2014-01-03 02:15:00','2014-01-03 02:30:00',
            '2014-01-04 02:45:00','2014-01-04 03:00:00'],
            'A':[10,11,12,13,14,15,16,17,18,19,20,21],
            'B':[9,8,7,6,5,4,3,2,1,0,1,2],
            'C':[90,88,84,78,70,60,48,34,18,0,20,42]}
    
    df = pd.DataFrame(Dict)
    df['Dates'] = pd.to_datetime(df['Dates'])
    df.set_index('Dates',inplace=True)
    
    DailySums = df.groupby(df.index.date).sum()
    DailySums['D'] = DailySums.C / DailySums.A
    DailySums.index = pd.to_datetime(DailySums.index)
    
    df1 = pd.merge(df, DailySums[['D']], left_on=df.index.date, 
        right_on=DailySums.index.date,how='left').set_index('key_0')
    

    会给你:

                 A  B   C         D
    key_0                          
    2014-01-01  10  9  90  7.939394
    2014-01-01  11  8  88  7.939394
    2014-01-01  12  7  84  7.939394
    2014-01-02  13  6  78  5.481481
    2014-01-02  14  5  70  5.481481
    2014-01-03  15  4  60  1.882353
    2014-01-03  16  3  48  1.882353
    2014-01-03  17  2  34  1.882353
    2014-01-03  18  1  18  1.882353
    2014-01-03  19  0   0  1.882353
    2014-01-04  20  1  20  1.512195
    2014-01-04  21  2  42  1.512195
    

    【讨论】:

    • 我认为在 groupby 对象上使用 transform 方法会给你一些更简洁的语法。从臀部射击:也许像df['D'] = df.groupby(...).transform(lambda g: g['A'].sum() / g['C'].sum())
    • 非常感谢您的回复。
    • @ Liam Foley:在“DailySums = df.groupby(df.index.date).sum()”行中,我收到“AttributeError: 'DatetimeIndex object has no attribute 'date '
    • @Paul H:我已经尝试过您的解决方案,因为它看起来很精简 :-) 不幸的是 groupby 在 resample.py 中遇到了“断言错误”
    • @MarkusW 我认为您实际上需要按pandas.TimeGrouper 分组(或类似的东西——我不在我的机器旁)。该对象采用字符串 (1D) 或 pandas.Offset 对象。稍后当我在机器前时,我会尝试了解更多细节。
    猜你喜欢
    • 1970-01-01
    • 2022-12-03
    • 2015-07-31
    • 2019-11-23
    • 1970-01-01
    • 2017-03-26
    • 2022-11-12
    • 2019-11-11
    • 1970-01-01
    相关资源
    最近更新 更多