Python 使用表获取列和行中的平均值
我有以下Python 使用表获取列和行中的平均值,python,python-3.x,pandas,dataframe,pivot-table,Python,Python 3.x,Pandas,Dataframe,Pivot Table,我有以下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-
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
code
和y\u m
是str
,date\u 1/2
是ISODate
我想首先按code
和y\u m
分组,然后计算date\u 2-date\u 1
,为每组中的Timedelta
值创建一个新列avg\u 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\u m
转换成行,将avg\u 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
表示虚拟值,该虚拟值指示特定代码的y_m不存在值,或者用于保持矩阵形状0
表示“所有”值,该值对code
或y_m
或code
和y_m
进行平均,例如,单元格(1,1)对所有y_m
和的平均值进行平均(1,2)
对201710
的平均值10
和20
但是当我试着
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版本为bellow0.21.0
未实施,请使用:
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)
你的熊猫版本是什么?我在pandas 0.22.0
中测试了它,运行良好。可能是以下版本0.21.0
?