对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
相关产品推荐
相关产品推荐

