我有一个想要更改的datetime列和value列。目标是为每个月创建一列,并为每个月创建一个显示平均值的行。
import pandas as pd
import numpy as np
import calendar
d = dict(enumerate(calendar.month_abbr))
rng = pd.date_range('2019-01-01', periods=365, freq='D')
df= pd.DataFrame({'Date': rng, 'Val': np.random.randint(10, size=365)})
df.set_index('Date', inplace=True)
df = df.resample('1M').mean().reset_index()
df['Month'] = df['Date'].apply(lambda x: d[x.month])
df.pivot(columns='Month', values='Val')
输出应为12列1月,2月,3月等...和1行,这是每个月的平均值。
答案 0 :(得分:1)
改为使用pd.pivot_table:
import pandas as pd
import numpy as np
import calendar
d = dict(enumerate(calendar.month_abbr))
rng = pd.date_range('2019-01-01', periods=365, freq='D')
df= pd.DataFrame({'Date': rng, 'Val': np.random.randint(10, size=365)})
df.set_index('Date', inplace=True)
df = df.resample('1M').mean().reset_index()
df['Month'] = df['Date'].apply(lambda x: d[x.month])
pd.pivot_table(data=df,columns='Month', values='Val', aggfunc=np.mean)
输出:
Month Apr Aug Dec Feb Jan Jul Jun \
Val 3.2 4.419355 4.548387 5.857143 5.322581 4.354839 5.033333
Month Mar May Nov Oct Sep
Val 4.645161 4.193548 4.966667 3.645161 3.7
答案 1 :(得分:0)
强制 PortfolioReturn PortfolioRisk
1 0.275 0.4355
2 0.270 0.3772
3 0.265 0.3245
4 0.260 0.2774
5 0.255 0.2359
6 0.250 0.2000
7 0.245 0.1697
8 0.240 0.1451
9 0.235 0.1260
10 0.230 0.1126
11 0.225 0.1048
12 0.220 0.1026
13 0.215 0.1060
14 0.210 0.1151
15 0.205 0.1297
16 0.200 0.1500
17 0.195 0.1759
18 0.190 0.2074
19 0.185 0.2445
20 0.180 0.2872
21 0.175 0.3355
到所有df.index
,并用0
调用pivot
命令
reindex
或者直接做一线客
df.index = [0]*df.index.size
df_out = df.pivot(columns='Month', values='Val').reindex(columns=df.Month)
如果您不想如上所述更改df_out = (df.set_index(np.array([0]*df.index.size))
.pivot(columns='Month', values='Val').reindex(columns=df.Month))
Out[88]:
Month Jan Feb Mar Apr May Jun Jul Aug \
0 4.290323 3.75 4.032258 4.033333 4.225806 4.4 4.774194 4.774194
Month Sep Oct Nov Dec
0 4.6 4.16129 4.233333 3.935484
,则可以将df.index
与pivot
,ffill
和bfill
一起使用
iloc