我有一个冗长的CSV文件,覆盖了几天,每隔5秒就会有来自5个周期重复的多个渠道的数据。格式与此类似:
create table another_table as
select map_col['colAAA'] as colAAA, ...etc
from some_table
问题是,我们有一些峰值使分析混乱,因为它们比平均值大几个数量级,从而影响了计算和图表。
我想获取每个通道的平均值,然后滤除平均值的两倍。这似乎可以过滤掉我们的峰值。
但是,我不知道该怎么做,我对大熊猫的了解并不多。我可以按单个值过滤整个数据帧,但我知道我需要根据其平均* 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)
这将删除大于中位数两倍的值。使用中位数会比平均值更好。