分组下采样和pd.DataFrame绘图

时间:2014-10-01 12:40:47

标签: python plot pandas

我正在尝试将分组数据下采样到每日平均值,为每个组计算,并在单个图中绘制结果时间序列。 我的出发点是以下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()

...导致包含所需输出的组合数据框和以下图: What it should look like

在我看来,通过在初始数据帧上使用groupby可以更轻松地实现这一点,但到目前为止,我还无法使用此方法重现所需的绘图。

这样做的“智能方法”是什么?

编辑: 更大的数据样本(csv,1000行)位于:http://pastebin.com/gi16nZdh

谢谢, 的Matthias

1 个答案:

答案 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')重新取样。

Example plot