我正在尝试将分组数据下采样到每日平均值,为每个组计算,并在单个图中绘制结果时间序列。
我的出发点是以下pd.DataFrame
:
value time type
0.1234 2013-04-03 A
0.2345 2013-04-05 A
0.34564 2013-04-07 A
... ... ...
0.2345 2013-04-03 B
0.1234 2013-04-05 B
0.2345 2013-04-07 C
0.34564 2013-04-07 C
我想为每种类型的内容计算每日均值,并在单个图中绘制这些日常均值的时间序列。
我目前有这个......
names = list(test['type'].unique())
types = []
for name in names:
single = df.loc[df.type == name]
single = single.set_index(single.time, drop=False)
single = single.resample("D")
types.append(single)
for single, name in zip(types, names):
single.rename(columns={"value":name}, inplace=True)
combined = pd.concat(types, axis=1)
combined.plot()
...导致包含所需输出的组合数据框和以下图:
在我看来,通过在初始数据帧上使用groupby
可以更轻松地实现这一点,但到目前为止,我还无法使用此方法重现所需的绘图。
这样做的“智能方法”是什么?
编辑: 更大的数据样本(csv,1000行)位于:http://pastebin.com/gi16nZdh
谢谢, 的Matthias
答案 0 :(得分:2)
您可以轻松地使用pandas.DataFrame.pivot
做您想做的事情,我已在下方创建了一个随机示例DataFrame,然后使用df.pivot
按需排列该表。
注意:我已经每周重新采样一次,因为我每天每种类型只有一个数据值,请不要忘记更改数据。
import pandas as pd
import matplotlib.pyplot as plt
dates = pd.date_range('2013-04-03', periods = 50, freq='D')
dfs = [pd.DataFrame(dict(time=dates, value=pd.np.random.randn(len(dates)), type=i)) for i in ['A', 'B', 'C', 'D']]
df = pd.concat(dfs)
pivoted = df.pivot(index='time', columns='type', values='value')
pivoted.resample('W')
print(pivoted.head(10))
# type A B C D
# time
# 2013-04-03 0.161839 0.509179 0.055078 -2.072243
# 2013-04-04 0.323308 0.891982 -1.266360 1.950389
# 2013-04-05 -2.542464 -0.441849 -2.686183 0.717737
# 2013-04-06 0.750871 0.438343 -0.002004 0.478821
# 2013-04-07 -0.118890 1.026121 1.283397 -1.306257
# 2013-04-08 -0.396373 -1.078925 -0.539617 -1.625549
# 2013-04-09 0.328076 1.964779 0.194198 0.232702
# 2013-04-10 -0.178683 0.177359 0.500873 -0.729988
# 2013-04-11 0.762800 1.576662 -0.456480 0.526162
# 2013-04-12 -1.301265 -0.586977 -0.903313 0.162008
pivoted.plot()
plt.show()
此代码创建一个名为pivoted
的pivot_table,其中每个列现在都是type
,数据是索引。然后,我们只需使用pivoted.resample('W')
重新取样。