我有以下pandas DataFrame:
time Group blocks
0 1 A 4
1 2 A 7
2 3 A 12
3 4 A 17
4 5 A 21
5 6 A 26
6 7 A 33
7 8 A 39
8 9 A 48
9 10 A 59
.... .... ....
36 35 A 231
37 1 B 1
38 2 B 1.5
39 3 B 3
40 4 B 5
41 5 B 6
.... .... ....
911 35 Z 349
这是一个包含多个时间序列问号数据的数据框,从min=1
到max=35
。每个Group
都有这样的时间序列。
我想将每个单独的时间序列A到Z绘制为1到35的x轴。每次y轴都是blocks
。
我正在考虑使用像Andrews Curves plot这样的东西,它会将每个系列相互映射。每个"色调"将被设置为不同的组。 (欢迎其他想法。)
我的问题:如何格式化此数据框以绘制多个系列?列应该是GroupA
,GroupB
等吗?
如何使数据框格式为:
time GroupA blocksA GroupsB blocksB GroupsC blocksC....
这是安德鲁斯情节的正确格式,如图所示?
修改
如果我尝试:
df.groupby('Group').plot(legend=False)
x轴完全不正确。所有时间序列应绘制在0到35之间,所有时间序列都在一个系列中。
我该如何解决这个问题?
答案 0 :(得分:7)
看看这些变种。首先是安德鲁斯'曲线,第二个是多线图,按一列Month
分组。数据框data
包含三列Temperature
,Day
和Month
:
import pandas as pd
import statsmodels.api as sm
import matplotlib.pylab as plt
from pandas.tools.plotting import andrews_curves
data = sm.datasets.get_rdataset('airquality').data
fig, (ax1, ax2) = plt.subplots(nrows = 2, ncols = 1)
data = data[data.columns.tolist()[3:]] # use only Temp, Month, Day
# Andrews' curves
andrews_curves(data, 'Month', ax=ax1)
# multiline plot with group by
for key, grp in data.groupby(['Month']):
ax2.plot(grp['Day'], grp['Temp'], label = "Temp in {0:02d}".format(key))
plt.legend(loc='best')
plt.show()
当你策划安德鲁斯'将您的数据曲线修复为一个函数。这意味着安德鲁斯'由靠近在一起的函数表示的曲线表明相应的数据点也将靠近在一起。
答案 1 :(得分:2)
您可以将数据重新构造为数据透视表:
df.pivot_table(index='time',columns='Group',values='blocks',aggfunc='sum').plot()