熊猫数据框,从groupby中筛选出值中的值

时间:2020-10-13 12:39:42

标签: pandas dataframe pandas-groupby

我有一个冗长的CSV文件,覆盖了几天,每隔5秒就会有来自5个周期重复的多个渠道的数据。格式与此类似:

create table another_table as
select map_col['colAAA'] as colAAA, ...etc
  from some_table

问题是,我们有一些峰值使分析混乱,因为它们比平均值大几个数量级,从而影响了计算和图表。

我想获取每个通道的平均值,然后滤除平均值的两倍。这似乎可以过滤掉我们的峰值。

但是,我不知道该怎么做,我对大熊猫的了解并不多。我可以按单个值过滤整个数据帧,但我知道我需要根据其平均* 2过滤每个通道的值。

2 个答案:

答案 0 :(得分:0)

您可以使用每组的平均值创建一个新列

df = df.join(df.groupby('IoT Channel')['calculated_value'].mean(), on='IoT Channel', rsuffix='_mean')

并过滤比calculated_value_mean大2倍的峰值。

df_new = df.drop(df[(df['calculated_value'] > (2 * df['calculated_value_mean']))].index)

答案 1 :(得分:0)

这是我的处理方法:

from io import StringIO


df = pd.read_csv(StringIO("""IoT_Channel,Datetime,calculated_value
Chan1   ,       01/01/2020 01:00:00   ,  1.50203
Chan2   ,       01/01/2020 01:00:00   ,  0.80203
Chan3   ,       01/01/2020 01:00:00   ,  4.23232
ChanN   ,       01/01/2020 01:00:00   ,  2.32123
Chan1   ,       01/01/2020 01:00:05   ,  1.23232
Chan2   ,       01/01/2020 01:00:05   ,  0.23234
Chan3   ,       01/01/2020 01:00:05   ,  3.12312
ChanN   ,       01/01/2020 01:00:05   ,  5.12321
Chan1   ,       01/01/2020 01:00:10   ,  1.12312
Chan2   ,       01/01/2020 01:00:10   ,  0.99232
Chan3   ,       01/01/2020 01:00:10   ,  5.23323
ChanN   ,       01/01/2020 01:00:10   ,  2.00012
Chan1   ,       01/01/2020 01:00:15   ,  1.55552
Chan2   ,       01/01/2020 01:00:15   ,  0.77874
Chan3   ,       01/01/2020 01:00:15   ,  4.23232
ChanN   ,       01/01/2020 01:00:15   ,  2.32123"""))


df_median = df.groupby("IoT_Channel")['calculated_value'].median()
# merge median values
df = df.merge(df_median, left_on='IoT_Channel', right_index=True)
# filter 
df = df[df.calculated_value_x < 2*df.calculated_value_y]
#drop added cols and rename them
del df["calculated_value_x"]
df.rename(columns={'calculated_value_y':'calculated_value'}, inplace=True)

这将删除大于中位数两倍的值。使用中位数会比平均值更好。

相关问题