更新:这是代码的简化版本(根据要求)产生相同的错误:
import numpy as np
line = [0,0,0,1,1,1,3,3,3,4,4,4]
x = [0,0,0,0,0,0,1,1,1,1,1,1]
y = [0,0,0,1,1,1,0,0,0,1,1,1]
number = np.arange(0, 120, 10)
cnumber = number +1j*0
FrData = [line, x, y, cnumber]
import pandas as pd
ToProcess = pd.DataFrame(data = zip(*(FrData)), index = FrData[0],
columns = ['line', 'x', 'y', 'cnumber'])
CleanData = ToProcess.groupby(['line', 'x', 'y'])['cnumber'].mean().reset_index()
有效,但给我一个错误 - 数据不再是复数:
/usr/lib64/python2.7/site-packages/pandas/core/nanops.py:496:ComplexWarning:将复杂值转换为实际丢弃虚部 x = float(x)
错误指向pandas代码的那一部分:
def _ensure_numeric(x):
if isinstance(x, np.ndarray):
if x.dtype == np.object_:
x = x.astype(np.float64)
elif not (com.is_float(x) or com.is_integer(x)):
try:
x = float(x)
except Exception:
raise TypeError('Could not convert %s to numeric' % str(x))
return x
我可以看到,而且我知道x.astype(np.complex)缺失了 - 我很确定在以前版本的熊猫我根据帖子改变了(我没有现在找到) - 我需要在那里添加它,所以它不会将我的复数转换回浮点数 - 有什么建议吗?
UPDATE 一个临时解决方案是在nanops.py中更改上述函数,并将x = float(x)替换为x = x.astype(np.complex),因此代码的一部分现在是:
def _ensure_numeric(x):
if isinstance(x, np.ndarray):
if x.dtype == np.object_:
x = x.astype(np.float64)
elif not (com.is_float(x) or com.is_integer(x)):
try:
x = x.astype(np.complex)
except Exception:
raise TypeError('Could not convert %s to numeric' % str(x))
return x
这对我有用,但我不确定它是否是正确/完整的解决方案
答案 0 :(得分:0)
大概你想要复数(numpy.real)的真实部分,不幸的是,这并不能很好地与pandas Series / DataFrame一起玩,所以你需要应用索引:
In [11]: s = pd.Series([1 + 1j])
In [12]: s
Out[12]:
0 (1+1j)
dtype: complex128
In [13]: np.real(s)
Out[13]:
array([ 1.])
In [14]: pd.Series(np.real(s), s.index, name=s.name)
Out[14]:
0 1
dtype: float64