python - 使用 np.abs 将 dataframe 中的 real 和 imag 列组合成复数以获得幅度
问题描述
我有一个数据框,它的复数分为实数列和虚数列。我想在计算对数幅度的数据框中添加一列(实际上,每个通道一个列):
` ch1_real ch1_imag ch2_real ch2_imag ch1_phase ch2_phase distance
79 0.011960 -0.003418 0.005127 -0.019530 -15.95 -75.290 0.0
78 -0.009766 -0.005371 -0.015870 0.010010 -151.20 147.800 1.0
343 0.002197 0.010990 0.003662 -0.013180 78.69 -74.480 2.0
80 -0.002686 0.010740 0.011960 0.013430 104.00 48.300 3.0
341 -0.007080 0.009033 0.016600 -0.000977 128.10 -3.366 4.0
如果我试试这个:
df['ch1_log_mag']=20*np.log10(np.abs(complex(df.ch1_real,df.ch1_imag)))
我收到错误:“TypeError:无法将系列转换为 <class 'float'>”,因为我认为 cmath.complex 无法处理数组。
所以我然后尝试使用 loc 来挑选 ch1_real 的第一个元素,例如,然后弄清楚如何使用它来完成我想要做的事情,但无法弄清楚如何去做:
df.loc[0,df['ch1_real']]
这会产生一个 KeyError。
暴力破解它的工作原理,
df['ch1_log_mag'] = 20 * np.log10(np.sqrt(df.ch1_real**2+ df.ch1_imag**2))
但是,我相信使用 np.abs 来获得幅度更清晰,而且我更感兴趣的是了解数据帧和索引数据帧的工作原理以及为什么我最初尝试的方法不起作用。
顺便说一句, df.ch1_real 和 df['ch1_real'] 有什么区别?我什么时候使用一个与另一个?
编辑:我尝试使用apply的解决方案的更多尝试,因为我的理解是它将传递给它的函数“应用”到每一行(默认情况下):
df.apply(complex(df['ch1_real'], df['ch1_imag']))
但这会产生相同的 TypeError,因为我认为问题是复杂不能在 Series 上工作。也许如果我让这个系列浮动?
阅读这篇文章后,我尝试使用 pd.to_numeric 将系列转换为浮点类型:
dfUnique.apply(complex(pd.to_numeric(dfUnique['ch1_real'],errors='coerce'), pd.to_numeric(dfUnique['ch1_imag'],errors='coerce')))
无济于事。
解决方案
您可以使用1j
表示复数的简单乘法0+1j
,请参阅虚构文字:
df['ch1_log_mag'] = 20 * np.log10((df.ch1_real + 1j * df.ch1_imag).abs())
complex(df.ch1_real, df.ch1_imag)
不起作用,因为它需要一个浮点参数,而不是整个系列。df.loc[0,df['ch1_real']]
不是一个有效的表达式,因为第二个参数必须是一个字符串,而不是一个系列(df.loc[79,'ch1_real'] 将用于访问元素)。
如果你想使用apply
它应该是20 * np.log10(df.apply(lambda x: complex(x.ch1_real, x.ch1_imag), 1).abs())
,但由于 apply 只是数据帧行上的一个变相循环,因此不建议在性能方面使用它。
df.ch1_real
和之间没有区别df['ch1_real']
,这是个人喜好问题。如果您的列名包含空格或点等,则必须使用后一种形式。
推荐阅读
- c++ - g++ -I 和 -L 命令查找 .hpp 文件不起作用
- php - 部署 Symfony 4 应用程序时出现路由问题
- python - 使用 Python 逐行向 Excel 写入和设置样式
- docker - 将 SSH 密钥复制到容器的问题
- python - 为什么 scipy curve_fit 和 statsmodel WLS 在加权时会给出不同的结果
- java - 使用 Cucumber JVM 运行测试时出现 UndefinedStepException
- javascript - 如何检查输入的值
- python - 记录器正在锁定日志文件。无法创建新的日志文件
- winforms - 如果输入改变则清除输出
- javascript - Smarty 变量不会从 Javascript 内部更改