我有这种形式的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()
基本上我有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)
即。看起来像这样的东西:
但我无法弄清楚如何使用group by函数(转换,应用等)来实现相同的结果。如何使用pandas以简洁的方式做到这一点?
(请注意:在完整应用中,这不是正弦波,而是对每个周期开始时发出的信号的物理响应。所以我不寻找强大的对齐信号或检测频率的方法。)
答案 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)