pandas groupby复数失败

时间:2014-04-02 21:41:43

标签: python pandas

更新:这是代码的简化版本(根据要求)产生相同的错误:

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

这对我有用,但我不确定它是否是正确/完整的解决方案

1 个答案:

答案 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