You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

对DataFrame列中每行列表应用signal.stft函数报错的解决求助

问题解决:对DataFrame每行列表计算STFT并存储

错误原因分析

你原来的代码存在两个关键问题:

  • 错误使用df1[signal.stft(f)]:signal.stft()返回的是频率数组、时间数组和STFT矩阵的元组,不是DataFrame的列名,用df1去索引这个结果完全不符合逻辑。
  • 输入类型问题:直接将列表传入signal.stft(),可能导致函数无法正确识别数据维度,触发IndexError。

解决方案

步骤1:构造示例数据(模拟你的2行测试数据)

import pandas as pd
import numpy as np
from scipy import signal

# 生成2行,每行含1024个元素的列表
df1 = pd.DataFrame({
    'MI_range': [np.random.randn(1024).tolist(), np.random.randn(1024).tolist()]
})

步骤2:定义STFT计算函数

将每行的列表转为numpy数组(signal.stft对数组处理更稳定),计算后返回需要的结果(可选返回全部三个值,或仅保留STFT矩阵):

def compute_stft(data_list):
    # 把列表转为numpy数组
    data_array = np.array(data_list)
    # 计算STFT,fs替换为你的实际采样率
    f, t, Zxx = signal.stft(data_array, fs=1000)  # 示例采样率设为1000Hz
    # 可选:返回全部结果,或只返回Zxx(STFT频谱矩阵)
    return (f, t, Zxx)

步骤3:将函数应用到DataFrame列

# 生成sTFT列,存储每行的STFT结果
df1['sTFT'] = df1['MI_range'].apply(compute_stft)

仅保留STFT矩阵的简化版本

如果只需要频谱矩阵Zxx,修改函数即可:

def compute_stft(data_list):
    data_array = np.array(data_list)
    _, _, Zxx = signal.stft(data_array, fs=1000)
    return Zxx

df1['sTFT'] = df1['MI_range'].apply(compute_stft)

扩展:使用plt.psd计算功率谱密度

如果需要用matplotlib.pyplot.psd,逻辑完全一致:

import matplotlib.pyplot as plt

def compute_psd(data_list):
    data_array = np.array(data_list)
    psd_values, freqs = plt.psd(data_array, Fs=1000)
    return (freqs, psd_values)

df1['PSD'] = df1['MI_range'].apply(compute_psd)

内容的提问来源于stack exchange,提问作者S N B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 06:47:24