Pandas:使用apply对数据框的行和列求和

时间:2016-10-04 18:31:39

标签: python pandas aggregation

import datetime
import pandas as pd
import numpy as np

todays_date = datetime.datetime.now().date()
index = pd.date_range(todays_date-datetime.timedelta(10), periods=10, freq='D')

columns = ['A','B', 'C']
df = pd.DataFrame(index=index, columns=columns)
df = df.fillna(0) # with 0s rather than NaNs
data = np.array([np.arange(10)]*3).T
df = pd.DataFrame(data, index=index, columns=columns)

鉴于 df ,我想按照每个列进行分组'并应用一个函数来计算每个日期的值之和除以该组的总和(A,B,C)?

示例:

def total_calc(grp):
    sum_of_group = np.sum(group)
    return sum_of_group

我正在尝试使用' apply'以这种方式在我的数据框上运行,但轴= 1 仅适用于行,轴= 0 适用于列,我想为每个组获取两个数据点?

df.groupby(["A"]).apply(total_calc)

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我不确定你的问题所以我猜它。首先,我不喜欢使用整数值,所以让我们将你的df转换为float

df = df.astype(float)

如果你想将A列的每个元素除以A列的总和,反之亦然,你可以这样做:

df.div(df.sum(axis=0), axis=1)
Out[24]: 
                   A         B         C
2016-09-24  0.000000  0.000000  0.000000
2016-09-25  0.022222  0.022222  0.022222
2016-09-26  0.044444  0.044444  0.044444
2016-09-27  0.066667  0.066667  0.066667
2016-09-28  0.088889  0.088889  0.088889
2016-09-29  0.111111  0.111111  0.111111
2016-09-30  0.133333  0.133333  0.133333
2016-10-01  0.155556  0.155556  0.155556
2016-10-02  0.177778  0.177778  0.177778
2016-10-03  0.200000  0.200000  0.200000