Pandas没有正确检测系列的数据类型

时间:2014-06-27 20:06:52

标签: pandas type-conversion series

我正在遇到一些与熊猫系列有点令人沮丧的事情。我有一个包含多个列的DataFrame,包含数字和非数字数据。但是,出于某种原因,pandas认为某些 numeric 列是非数字的,当我尝试运行像.describe()这样的聚合函数时会忽略它们。这是一个问题,因为当我尝试在这些列上运行分析时,pandas会引发错误。

我从终端复制了一些命令作为例子。当我对'ND_Offset'列(有问题的列)进行切片时,pandas会将其标记为object的dtype。然而,当我调用.describe()时,pandas会用dtype float64标记它(它应该是什么)。另一方面,“Dwell”列完全按照预期运行,pandas两次都提供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函数按另一个属性对数据进行分组时(当这些Series是DataFrame的一部分时),当我尝试调用{{1时}时出现DataError: No numeric types to aggregate错误在组上。另一方面,当我尝试在同一数据上调用.agg(np.mean) 时,情况正常。

这有点奇怪 - 任何人都可以解释发生了什么吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

可能是因为ND_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

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

for val in df['A']:
    if not isinstance(val, float):
        print('Error: val = {!r}'.format(val))