在熊猫中应用群组的平均值

时间:2014-02-26 00:21:20

标签: python numpy pandas

我有这种形式的DataFrame:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

np.random.seed(0)

# generate contrived data
df = pd.DataFrame({"Timestep" : np.arange(1000),
                   "Sensor Reading" : np.sin(np.arange(1000) * 2 * np.pi/100.0) + 0.1 * np.random.standard_normal(1000),
                   "Label" : np.repeat(np.arange(10), [96, 107, 95, 104, 97, 100, 105, 103, 100, 93])
                   })
plt.plot(df["Sensor Reading"])
plt.figure()

enter image description here

基本上我有10个期间由“Label”列标识,每个 100个来自传感器的噪声读数。

我希望通过堆叠/对齐10个周期中的每个周期(修剪到最短周期)并获得每个时间点的平均值来获得平均信号。我可以使用以下代码迭代地执行此操作:

grouped = df.groupby("Label")

# current method
grouplength = min(len(g) for k, g in grouped)
reference_result = np.zeros(grouplength)
for k, group in grouped:
    reference_result += group["Sensor Reading"][:grouplength]/len(grouped)

即。看起来像这样的东西:

enter image description here

但我无法弄清楚如何使用group by函数(转换,应用等)来实现相同的结果。如何使用pandas以简洁的方式做到这一点?

(请注意:在完整应用中,这不是正弦波,而是对每个周期开始时发出的信号的物理响应。所以我寻找强大的对齐信号或检测频率的方法。)

2 个答案:

答案 0 :(得分:3)

您可以使用cumcount(0.13中的新内容)更有效地执行此操作:

grouplength = grouped.size().min()
cumcount = grouped.cumcount()
sub_df = df.loc[cumcount < grouplength, 'Sensor Reading']

如果索引是唯一的,您可以按cumcount分组并取平均值:

reference_result = sub_df.groupby(cumcount).mean().values

答案 1 :(得分:2)

在每个群组中调用reset_index方法:

avg = df.groupby("Label")["Sensor Reading"].apply(pd.Series.reset_index, drop=True).mean(level=1)
avg.plot(avg)