python pandas复数

时间:2013-09-20 14:48:50

标签: python pandas

我正在使用pandas,它可以非常有效地按照我需要的方式对数据进行排序/过滤。

此代码工作正常,直到我将最后一列更改为复数;现在我收到了一个错误。

  

返回self._cython_agg_general('mean')引发DataError('无数字   要聚合的类型')pandas.core.groupby.DataError:没有数字类型   聚合

错误是指我的第八列(带有复数),因为我想要平均值 我找不到将对象转换为复数的方法(据我所知,大熊猫现在支持复数)。

这是我使用的代码。

import numpy as np
import pandas as pd
df = pd.read_csv('final.dat', sep=",", header=None)
df.columns=['X.1', 'X.2', 'X.3', 'X.4','X.5', 'X.6', 'X.7', 'X.8']
df1 = df.groupby(["X.1","X.2","X.5"])["X.8"].mean().reset_index()

之后我得到上述错误。

当我读取我的文件时,这是df输出。

<class 'pandas.core.frame.DataFrame'>
Int64Index: 21266 entries, 0 to 21265
Data columns (total 8 columns):
X.1    21266  non-null values
X.2    21266  non-null values
X.3    21266  non-null values
X.4    21266  non-null values
X.5    21266  non-null values
X.6    21266  non-null values
X.7    21266  non-null values
X.8    21266  non-null values
dtypes: float64(4), int64(3), object(1)

这是input file的一小部分样本。

4 个答案:

答案 0 :(得分:5)

解析不支持直接读取复合体,因此请执行以下转换。

In [37]: df['X.8'] = df['X.8'].str.replace('i','j').apply(lambda x: np.complex(x))

In [38]: df
Out[38]: 
          X.1         X.2  X.3   X.4    X.5  X.6  X.7                X.8
0   564991.15  7371277.89    0     1   1530  0.1    2   (92.289+151.96j)
1   564991.15  7371277.89    0     1   8250  0.1    2   (104.22-43.299j)
2   564991.15  7371277.89    0     1  20370  0.1    2    (78.76-113.52j)
3   564991.15  7371277.89    0     1  33030  0.1    2    (27.141-154.1j)
4   564991.15  7371277.89    0     1  47970  0.1    2     (-30.012-175j)
5   564991.15  7371277.89    0     1  63090  0.1    2  (-118.52-342.43j)
6   564991.15  7371277.89    0     1  93090  0.1    2  (-321.02-1541.5j)
7   564991.15  7371277.89    0     2   1530  0.1    2   (118.73+154.05j)
8   564991.15  7371277.89    0     2   8250  0.1    2   (122.13-45.571j)
9   564991.15  7371277.89    0     2  20370  0.1    2   (93.014-116.03j)
10  564991.15  7371277.89    0     2  33030  0.1    2    (38.56-155.08j)
11  564991.15  7371277.89    0     2  47970  0.1    2  (-20.653-173.83j)
12  564991.15  7371277.89    0     2  63090  0.1    2  (-118.41-340.58j)
13  564991.15  7371277.89    0     2  93090  0.1    2    (-378.71-1554j)
14  564990.35  7371279.17    0  1785   1530  0.1    2   (-15.441+118.3j)
15  564990.35  7371279.17    0  1785   8250  0.1    2  (-7.1735-76.487j)
16  564990.35  7371279.17    0  1785  20370  0.1    2  (-33.847-145.99j)
17  564990.35  7371279.17    0  1785  33030  0.1    2  (-86.035-185.46j)
18  564990.35  7371279.17    0  1785  47970  0.1    2  (-143.37-205.23j)
19  564990.35  7371279.17    0  1785  63090  0.1    2  (-234.67-370.43j)
20  564990.35  7371279.17    0  1785  93090  0.1    2  (-458.69-1561.4j)
21  564990.36  7371279.17    0  1786   1530  0.1    2    (36.129+128.4j)
22  564990.36  7371279.17    0  1786   8250  0.1    2   (39.406-69.607j)
23  564990.36  7371279.17    0  1786  20370  0.1    2   (10.495-139.48j)
24  564990.36  7371279.17    0  1786  33030  0.1    2  (-43.535-178.19j)
25  564990.36  7371279.17    0  1786  47970  0.1    2  (-102.28-196.76j)
26  564990.36  7371279.17    0  1786  63090  0.1    2   (-199.32-362.1j)
27  564990.36  7371279.17    0  1786  93090  0.1    2  (-458.09-1565.6j)

In [39]: df.dtypes
Out[39]: 
X.1       float64
X.2       float64
X.3       float64
X.4         int64
X.5         int64
X.6       float64
X.7         int64
X.8    complex128
dtype: object

In [40]: df1 = df.groupby(["X.1","X.2","X.5"])["X.8"].mean().reset_index()

In [41]:  df.groupby(["X.1","X.2","X.5"])["X.8"].mean().reset_index()
Out[41]: 
          X.1         X.2    X.5                  X.8
0   564990.35  7371279.17   1530     (-15.441+118.3j)
1   564990.35  7371279.17   8250    (-7.1735-76.487j)
2   564990.35  7371279.17  20370    (-33.847-145.99j)
3   564990.35  7371279.17  33030    (-86.035-185.46j)
4   564990.35  7371279.17  47970    (-143.37-205.23j)
5   564990.35  7371279.17  63090    (-234.67-370.43j)
6   564990.35  7371279.17  93090    (-458.69-1561.4j)
7   564990.36  7371279.17   1530      (36.129+128.4j)
8   564990.36  7371279.17   8250     (39.406-69.607j)
9   564990.36  7371279.17  20370     (10.495-139.48j)
10  564990.36  7371279.17  33030    (-43.535-178.19j)
11  564990.36  7371279.17  47970    (-102.28-196.76j)
12  564990.36  7371279.17  63090     (-199.32-362.1j)
13  564990.36  7371279.17  93090    (-458.09-1565.6j)
14  564991.15  7371277.89   1530  (105.5095+153.005j)
15  564991.15  7371277.89   8250    (113.175-44.435j)
16  564991.15  7371277.89  20370    (85.887-114.775j)
17  564991.15  7371277.89  33030    (32.8505-154.59j)
18  564991.15  7371277.89  47970  (-25.3325-174.415j)
19  564991.15  7371277.89  63090  (-118.465-341.505j)
20  564991.15  7371277.89  93090  (-349.865-1547.75j)

答案 1 :(得分:3)

或者,当您读入数据时,可以通过传入该列的转换器将其直接解析为复数:

pd.read_csv('final.dat', header=None,
            names=['X.1', 'X.2', 'X.3', 'X.4','X.5', 'X.6', 'X.7', 'X.8'],
            converters={'X.8': lambda s: np.complex(s.replace('i', 'j'))})

答案 2 :(得分:0)

要转换所有列,请尝试pd.applymap(lambda s: np.complex(s.replace('i', 'j')))

答案 3 :(得分:0)

我尝试实现lambda,但出现错误:

ValueError:complex()arg是格式错误的字符串

我发现我必须消除空格并将“ i”字符更改为“ j” 这是我的代码:

for tits in df.columns:
    if df[tits].dtypes =='O':
        df[tits] = df[tits].str.replace('i','j')
        df[tits] = df[tits].str.replace(' ','')
        df[tits] = df[tits].apply(lambda x: np.complex(x))
print(df[df.columns[1]])
print(df.dtypes)