【问题标题】:pandas pivot_table to get the avg value in columns and rowspandas pivot_table 获取列和行中的平均值
【发布时间】:2018-10-02 15:10:27
【问题描述】:

我有以下df

code    y_m        date_1        date_2
10     201710      2017-10-01    2017-10-06
10     201710      2017-10-07    2017-10-09
10     201711      2017-11-06    2017-11-08
10     201711      2017-11-02    2017-11-06
20     201710      2017-10-03    2017-10-04
20     201710      2017-10-07    2017-10-08
20     201711      2017-11-06    2017-11-09
20     201711      2017-11-02    2017-11-03

codey_mstrdate_1/2ISODate

我想首先对codey_m进行分组,然后计算date_2-date_1为每个组中的Timedelta值创建一个新列avg_days

code_yr_mon_grp_by = df.groupby(['code', 'y_m'])

code_yr_mon_gr_avg_days = code_yr_mon_grp_by.apply(lambda row: (row['date_2'] - row['date_1']) / np.timedelta64(1, 'D')).mean(level=[0, 1]).reset_index(name='avg_days')

会生成

code   y_m      avg_days
10    201710     3.5
10    201711     3
20    201710     1
20    201711     2

然后我想将此df转换为将列y_m转置为行的矩阵,将avg_days设为矩阵单元格值,

     0     1        2            3             
0   -1     0     201710       201711       
1   0     2.375     2.25         2.5           
2   10    3.25      3.5          3                      
3   20    1.5       1            2                    

具体来说,-1 表示一个虚拟值,表示对于特定code 的 y_m 值不存在或保持矩阵形状; 0 表示“所有”值,平均 codey_mcodey_m,例如单元格 (1, 1) 平均所有 y_mcodeavg_days 值; (1,2)code 1020 之间平均 avg_days201710

但是当我尝试时

def convert_to_matrix(df, p_tab_idx, p_tab_cols, p_tab_vals, p_tab_agg_func):
    df_tab = (df.pivot_table(index=p_tab_idx,
                         columns=p_tab_cols,
                         values=p_tab_vals,
                         margins=True,
                         aggfunc=p_tab_agg_func,
                         fill_value=-1,
                         margins_name='0'))

    # change order of index and columns values for reindex
    idx = df_tab.index[-1:].tolist() + df_tab.index[:-1].tolist()
    cols = df_tab.columns[-1:].tolist() + df_tab.columns[:-1].tolist()

    df_tab = (df_tab.reindex(index=idx, columns=cols)
          .reset_index()
          .rename(columns={p_tab_idx: -1})
          .rename_axis(None, 1))

    # add columns to first row
    df_tab = df_tab.columns.to_frame().T.append(df_tab).reset_index(drop=True)
    # reset columns names to range
    df_tab.columns = range(len(df_tab.columns))
    # converts column labels from int to str
    df_tab.columns = df_tab.columns.astype(str)

    return df_tab

code_yr_mon_gr_proc_days_p_tab = convert_to_matrix(code_yr_mon_gr_avg_days,
                                                    p_tab_idx='code',
                                                    p_tab_cols='y_m',
                                                    p_tab_vals='avg_days',
                                                    p_tab_agg_func='mean')

我有错误

builtins.AttributeError: 'Index' object has no attribute 'to_frame'

我想知道如何解决这个问题并达到预期的效果。

【问题讨论】:

  • 你的熊猫版本是什么?我在pandas 0.22.0 中对其进行了测试,并且运行良好。也许下面的版本0.21.0to_frame ?

标签: python python-3.x pandas dataframe pivot-table


【解决方案1】:

如果pandas 版本低于0.21.0,其中Index.to_frame 未实现,请使用:

df_tab = (pd.DataFrame(df_tab.columns, index=df_tab.columns)
            .T
            .append(df_tab)
            .reset_index(drop=True))

改为:

df_tab = df_tab.columns.to_frame().T.append(df_tab).reset_index(drop=True)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-14
    • 2017-11-24
    • 2019-02-01
    • 2014-09-23
    • 2020-03-09
    相关资源
    最近更新 更多