Pandas 无法正确检测序列的数据类型

Pandas 无法正确检测序列的数据类型,pandas,type-conversion,series,Pandas,Type Conversion,Series,熊猫系列让我有点沮丧。我有一个数据框,有几列,有数字和非数字数据。然而,出于某种原因,pandas认为某些数值列是非数值的,当我尝试运行聚合函数(如.descripe())时会忽略它们。这是一个问题,因为当我尝试对这些列运行分析时,pandas会引发错误 我从终端复制了一些命令作为示例。当我切片'ND_Offset'列(有问题的列)时,pandas用object的数据类型标记它。然而,当我调用.descripe()时,pandas用dtypefloat64标记它(它应该是这样的)。另一方面,“驻

熊猫系列让我有点沮丧。我有一个数据框,有几列,有数字和非数字数据。然而,出于某种原因,pandas认为某些数值列是非数值的,当我尝试运行聚合函数(如
.descripe()
)时会忽略它们。这是一个问题,因为当我尝试对这些列运行分析时,pandas会引发错误

我从终端复制了一些命令作为示例。当我切片'ND_Offset'列(有问题的列)时,pandas用
object
的数据类型标记它。然而,当我调用
.descripe()
时,pandas用dtype
float64
标记它(它应该是这样的)。另一方面,“驻留”列的工作方式与它应该的工作方式完全相同,两次都给出
float64

有人知道我为什么会有这种行为吗

In [83]: subject.phrases['ND_Offset'][:3]
Out[83]: 
SubmitTime
2014-06-02 22:44:44    0.3607049
2014-06-02 22:44:44    0.2145484
2014-06-02 22:44:44    0.4031347
Name: ND_Offset, dtype: object

In [84]: subject.phrases['ND_Offset'].describe()
Out[84]: 
count     1255.000000
unique     432.000000
top          0.242308
freq        21.000000
dtype: float64

In [85]: subject.phrases['Dwell'][:3]
Out[85]: 
SubmitTime
2014-06-02 22:44:44    111
2014-06-02 22:44:44     81
2014-06-02 22:44:44    101
Name: Dwell, dtype: float64

In [86]: subject.phrases['Dwell'].describe()
Out[86]: 
count    1255.000000
mean       99.013546
std        30.109327
min        21.000000
25%        81.000000
50%        94.000000
75%       111.000000
max       291.000000
dtype: float64
当我使用
.groupby
函数按另一个属性(当这些序列是数据帧的一部分时)对数据进行分组时,我得到了
数据错误:当我尝试调用组上的
.agg(np.mean)
时,没有要聚合的数值类型。另一方面,当我试图对相同的数据调用
.agg(np.sum)
时,情况就很好了

这有点奇怪--有人能解释发生了什么事吗


谢谢大家!

这可能是因为
ND\u Offset
列(下面我称之为
A
)包含一个非数字值,例如空字符串。比如说,

import numpy as np
import pandas as pd

df = pd.DataFrame({'A': [0.36, ''], 'B': [111, 81]})
print(df['A'].describe())
# count     2.00
# unique    2.00
# top       0.36
# freq      1.00
# dtype: float64

try:
    print(df.groupby(['B']).agg(np.mean))
except Exception as err:
    print(err)
    # No numeric types to aggregate

print(df.groupby(['B']).agg(np.sum))
#         A
# B        
# 81       
# 111  0.36
使用
np.sum
进行聚合是因为

In [103]: np.sum(pd.Series(['']))
Out[103]: ''
np.mean(pd.Series([''])

TypeError: Could not convert  to numeric

要调试此问题,可以尝试使用以下方法查找非数值:


我们需要弄清楚为什么它是
dtype=object
。当您尝试
subject.phrases['ND\u Offset'].astype(float)
时会发生什么?如果我以那种方式显式转换它,它转换得很好;我的困惑是为什么它一开始就不认识它。在库的其他地方,我编写了一个解析器,它接受.csv文件并将它们转换为这个数据帧。我显式地将'ND_Offset'序列转换为浮点数,但当我加载数据帧时,它又认为它是一个对象。老实说,这是最奇怪的事情。我想我可以根据需要在程序的上游将该系列转换为浮点数,但这会使代码不那么枯燥。感谢您的关注。@kronosapiens doing
.descripe()
返回描述结果的数据类型(不是原始列!),但OP说
主题.phrases['ND\u Offset'].astype(float)
有效。(当然,“抄本或它没有发生”,正如孩子们所说。)好吧,也许可以通过将空字符串改为
'nan'
,使示例符合这一线索。但是,在没有可运行的示例的情况下,试图猜测确切的原因可能是不可能的,所以主要的一点是,该列中有一些非数字的内容。
for val in df['A']:
    if not isinstance(val, float):
        print('Error: val = {!r}'.format(val))