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