首页 > 解决方案 > 使用 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')))

无济于事。

标签: pythonpandasdataframeindexingcomplex-numbers

解决方案


您可以使用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'],这是个人喜好问题。如果您的列名包含空格或点等,则必须使用后一种形式。


推荐阅读