开发者社区> 问答> 正文

pandas数据帧切片产生不同的结果

我试图通过将数据帧切片传递给我的函数来对加速度计数据进行带通滤波,但是根据切片数据的方式得到不同的结果

我试图使用列名和索引使用,iloc但结果是不同的,所以我没有哪个结果是正确的结果

我的band 通过过滤功能:

def butter_bandpass(lowcut, highcut, fs, order=6):

nyq = 0.5 * fs
low = lowcut / nyq
high = highcut / nyq
b, a = butter(order, [low, high], btype='band')
return b, a

def butter_bandpass_filter(data, lowcut, highcut, fs):

b, a = butter_bandpass(lowcut, highcut, fs, order=6)
y = lfilter(b, a, data)
return y

在这两种方式之下,我曾经将我的数据传递给函数:第一种方式:使用tremor_0[['X']] as [[]]切片作为列名

y=pd.DataFrame(data=butter_bandpass_filter(tremor_0[['X']],0.3,12,100),columns=['X'])
第二种方式:使用tremor_0['X'] as []切片作为列名

y=pd.DataFrame(data=butter_bandpass_filter(tremor_0['X'],0.3,12,100),columns=['X'])
第一种方式的结果:

X

0 -0.001962
1 -0.001962
2 -0.001948
3 -0.001903
4 -0.001874
第二种方式的结果:

X

0 -0.001962
1 -0.019822
2 -0.095867
3 -0.298136
4 -0.675933
请注意,从第二行开始,值是不同的,那么哪种方式是正确的方法,为什么呢?

展开
收起
一码平川MACHEL 2019-01-21 11:31:42 2066 0
1 条回答
写回答
取消 提交回答
  • 当您使用时,您将tremor_0[['X']]获得一个数据帧对象,这是一个数组。当您使用时,您将tremor_0['X']获得一个可以轻松转换为列表的Series对象

    如果您只是尝试从一维列中提取数据然后使用,tremor_0['X']但您应该根据数据和您要实现的目标验证哪些结果有意义


    使用tremor_0['X']。

    首先,tremor_0[['X']]和tremor_0['X']是不一样的。

    假设您有一个数据帧:

    df = pd.DataFrame(np.ndarray((100, 10)), columns=['x_%i' % i for i in range(10)])
    type(df[['x_0']])

    pandas.core.frame.DataFrame

    type(df['x_0'])

    pandas.core.series.Series

    更重要的是,它们有不同的形状

    df[['x_0']].shape

    (100, 1)

    df['x_0'].shape

    (100, )

    其scipy.signal.lfilter处理方式不同,因为它适用于过滤器axis=-1。

    axis:int,optional 输入数据数组的轴,沿其应用线性过滤器。过滤器沿该轴应用于每个子阵列。默认值为-1。

    如果将lfilter参数更改为axis = 0,则butter_bandpass_filter返回带有样本值的数组。但请记住,生成的数组将遵循输入的形状。

    2019-07-17 23:26:04
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
中文:即学即用的Pandas入门与时间序列分析 立即下载
即学即用的Pandas入门与时间序列分析 立即下载
低代码开发师(初级)实战教程 立即下载