pandas按分类条件复制列数值到新列报ValueError问题咨询
报错原因
错误出在df.loc[x, 'peak'] = df.b.iloc[[x]]这一行:
- 你使用
df.b.iloc[[x]](双层方括号包裹下标)返回的是带索引的Series序列对象,但df.loc[x, 'peak']定位的是单个单元格,只能接收标量值,二者类型不兼容因此触发报错。 - 额外补充:代码中
if x == df.index[x]的判断是冗余的,你当前生成的DataFrame默认使用从0开始的连续整数索引,argrelmax/argrelmin返回的就是数值对应的行下标,和索引值完全一致,不需要额外判断。
修复方案
只需要把取数的双层方括号改为单层,直接取对应位置的标量值即可,修改后的完整代码如下:
import pandas as pd import numpy as np import matplotlib.pyplot as plt from scipy.signal import argrelmax, argrelmin # 生成模拟数据集 data = np.random.randint(0, 100,(25, 2)) df = pd.DataFrame(data , columns=['a', 'b']) # 标记峰值 peak = argrelmax(data = np.array(df.b), axis=0, order=2, mode='clip')[0] for x in peak: df.loc[x, 'value'] = 'peak' df.loc[x, 'peak'] = df.b.iloc[x] # 把[[x]]改为[x]取标量 # 标记谷值 trough = argrelmin(data = np.array(df.b), axis=0, order=2, mode='clip')[0] for x in trough: df.loc[x, 'value'] = 'trough' df.loc[x, 'trough'] = df.b.iloc[x] # 同上修改 # 可选:把peak、trough列的空值替换为空字符串,方便后续查看 df[['peak', 'trough']] = df[['peak', 'trough']].fillna('') print(df)
内容的提问来源于stack exchange,提问作者Sayed Gouda
相关产品推荐
相关产品推荐

