Python Pandas.mean()类型错误:无法转换为数字

Python Pandas.mean()类型错误:无法转换为数字,python,pandas,dataframe,numpy,mean,Python,Pandas,Dataframe,Numpy,Mean,我正在从事一个项目,在这个项目中,我将数据从SQL导入到一个数据框架中。这似乎进行得很顺利,但当我使用pandas.mean()时,它抛出了一个TypeError,表示串联的值列表无法转换为数字(见下文): 数据帧示例: df = ProductSKU OverallHeight-ToptoBottom 0 AAI2185 74.5 1 AAI2275 47 2 AAI2686

我正在从事一个项目,在这个项目中,我将数据从SQL导入到一个数据框架中。这似乎进行得很顺利,但当我使用pandas.mean()时,它抛出了一个TypeError,表示串联的值列表无法转换为数字(见下文):

数据帧示例:

df =
  ProductSKU OverallHeight-ToptoBottom
0   AAI2185                      74.5
1   AAI2275                        47
2   AAI2686                      56.5
3  AASA1002                     73.23
4  AASA1032                     39.37
5  AASA1039                     72.44
6  AASA1099                      75.6
7  AASA1101                        38
8  ABCM1910                        69
9  ABCM1980                        72
函数调用:

def summarizeTagData(df, tag):
    avgValue = df.loc[:,tag].dropna().mean()             <--- Breaks here
    stdevValue = df.loc[:,tag].dropna().std()
    lowerBound = max(avgValue-(3*stdevValue),0)
    upperBound = (avgValue+(3*stdevValue))
    outsideRangeCount = df[df[tag]>upperBound].shape[0]
    missingDataCount = df[df[tag].isnull()].shape[0]
    dataDict = {"Average":avgValue
            , "StDev":stdevValue
            , "UpperBound":upperBound
            , "LowerBound":lowerBound
            , "OutsideRange":outsideRangeCount
            , "MissingData":missingDataCount
            }
    return dataDict
def摘要数据(df,tag):
avgValue=df.loc[:,tag].dropna().mean()上限].shape[0]
missingDataCount=df[df[tag].isnull()]形状[0]
dataDict={“平均”:avgValue
,“StDev”:stdevValue
,“上限”:上限
,“LowerBound”:LowerBound
,“OutsideRange”:OutsideRange计数
,“MissingData”:missingDataCount
}
返回数据dict
控制台输出:

summarizeTagData(df, 'OverallHeight-ToptoBottom')
    Traceback (most recent call last):

  File "<ipython-input-22-f1f26a0a0520>", line 1, in <module>
    summarizeTagData(df, 'OverallHeight-ToptoBottom')

  File "C:/Users/tmori/Google Drive/Projects/Product Dimension Accuracy/ProductDataTag_Analysis.py", line 23, in summarizeTagData
    avgValue = df.loc[:,tag].dropna().mean()

  File "C:\Program Files\Anaconda\lib\site-packages\pandas\core\generic.py", line 5310, in stat_func
    numeric_only=numeric_only)

  ... 

  File "C:\Program Files\Anaconda\lib\site-packages\pandas\core\nanops.py", line 293, in nanmean
    the_sum = _ensure_numeric(values.sum(axis, dtype=dtype_sum))

  File "C:\Program Files\Anaconda\lib\site-packages\pandas\core\nanops.py", line 743, in _ensure_numeric
    raise TypeError('Could not convert %s to numeric' % str(x))

TypeError: Could not convert 74.54756.573.2339.3772.4475.6386972 to numeric
summaryTagdata(df,“总高度顶部底部”)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
汇总表数据(df,“总高度顶部至底部”)
文件“C:/Users/tmori/Google Drive/Projects/Product Dimension accurity/ProductDataTag_Analysis.py”,第23行,SummaryTagData中
avgValue=df.loc[:,tag].dropna().mean()
文件“C:\Program Files\Anaconda\lib\site packages\pandas\core\generic.py”,第5310行,在stat\u func中
仅数值=仅数值)
... 
文件“C:\Program Files\Anaconda\lib\site packages\pandas\core\nanops.py”,第293行,以nanmean表示
_sum=_sure_numeric(values.sum(axis,dtype=dtype_sum))
文件“C:\Program Files\Anaconda\lib\site packages\pandas\core\nanops.py”,第743行,数字
raise TypeError('无法将%s转换为数字'%str(x))
TypeError:无法将74.54756.573.2339.3772.4475.6386972转换为数字
最奇怪的是(我也弄不明白),当我通过CSV导入相同的数据时,它工作得非常好。只有当我通过SQL加载它时,它才会断开,这可能是我做的不对吗

最好的,
Tom

正如控制台输出所显示的,数据帧列
'OverallHeight-ToptoBottom'
存在问题

我的猜测是@Warren Weckesser,列中包含字符串。要检查该列的数据类型,请运行

print(df['OverallHeight-ToptoBottom'].dtype) 
假设上述情况属实,将列数据类型转换为float应该可以解决问题。为此目的


你能用一个代码重现这个错误吗?您的代码正在工作…输出{'Average':61.763999999996,'LowerBound':16.2873418114303,'MissingData':0,'outherange':0,'StDev':15.1588886062856554,'UpperBound':107.24065818856965}。检查
df['OverallHeight-ToptoBottom'。dtype
。我怀疑该列包含字符串(可能显示为type
object
),而不是浮点值。@WarrenWeckesser-Bingo。你的数据输入一针见血。我用pd.to_numeric()修复了它。谢谢
df["OverallHeight-ToptoBottom"] = pd.to_numeric(df["OverallHeight-ToptoBottom"], downcast="float")