Python透视表如何处理'\xc2\xa0';?

Python透视表如何处理'\xc2\xa0';?,python,csv,numpy,pandas,encoding,Python,Csv,Numpy,Pandas,Encoding,我有一个样本数据集,如下所示: #!/usr/bin/python import pandas as pd import os from os.path import basename def generate_timeSeries(fileToProcess): df = pd.read_csv(fileToProcess) timestamps = df.pivot_table('C_Number',['A_Id', 'P_Id'], 'Time Stamp')

我有一个样本数据集,如下所示:

#!/usr/bin/python
import pandas as pd
import os
from os.path import basename


def generate_timeSeries(fileToProcess):

    df = pd.read_csv(fileToProcess)
    timestamps = df.pivot_table('C_Number',['A_Id', 'P_Id'], 'Time Stamp')

    return timestamps

def main():

    folder_path = "Input/"

    for files in os.listdir(folder_path):

        print "processing",files
        file_to_open = os.path.join(folder_path, files)
        unicoded_file = unicode(file_to_open).encode('utf8')
        TimeSeries_dataframe = generate_timeSeries(unicoded_file)


        TimeSeries_dataframe.to_csv('Output/%s_timeseries.csv' % os.path.splitext(files)[0], sep=',', encoding='utf-8')


if __name__ == "__main__":
    main()

因此,我希望设置时间序列,并因此将所有时间序列作为列标题。因此,我的脚本如下:

#!/usr/bin/python
import pandas as pd
import os
from os.path import basename


def generate_timeSeries(fileToProcess):

    df = pd.read_csv(fileToProcess)
    timestamps = df.pivot_table('C_Number',['A_Id', 'P_Id'], 'Time Stamp')

    return timestamps

def main():

    folder_path = "Input/"

    for files in os.listdir(folder_path):

        print "processing",files
        file_to_open = os.path.join(folder_path, files)
        unicoded_file = unicode(file_to_open).encode('utf8')
        TimeSeries_dataframe = generate_timeSeries(unicoded_file)


        TimeSeries_dataframe.to_csv('Output/%s_timeseries.csv' % os.path.splitext(files)[0], sep=',', encoding='utf-8')


if __name__ == "__main__":
    main()
尝试运行脚本时,出现以下错误:

pandas.core.groupby.DataError: No numeric types to aggregate
以下是完整的错误跟踪:

Traceback (most recent call last):
  File "Error_AuthorTimeSeries.py", line 43, in <module>
    main()
  File "Error_AuthorTimeSeries.py", line 33, in main
    TimeSeries_dataframe = generate_timeSeries(unicoded_file)
  File "Error_AuthorTimeSeries.py", line 16, in generate_timeSeries
    timestamps = df.pivot_table('C_Number',['A_ID', 'P_ID'], 'Time Stamp')
  File "/usr/lib/python2.7/dist-packages/pandas/tools/pivot.py", line 104, in pivot_table
    agged = grouped.agg(aggfunc)
  File "/usr/lib/python2.7/dist-packages/pandas/core/groupby.py", line 437, in agg
    return self.aggregate(func, *args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/pandas/core/groupby.py", line 1994, in aggregate
    return getattr(self, arg)(*args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/pandas/core/groupby.py", line 452, in mean
    return self._cython_agg_general('mean')
  File "/usr/lib/python2.7/dist-packages/pandas/core/groupby.py", line 1917, in _cython_agg_general
    new_blocks = self._cython_agg_blocks(how, numeric_only=numeric_only)
  File "/usr/lib/python2.7/dist-packages/pandas/core/groupby.py", line 1964, in _cython_agg_blocks
    raise DataError('No numeric types to aggregate')
pandas.core.groupby.DataError: No numeric types to aggregate
Traceback (most recent call last):
  File "imeSeries.py", line 66, in <module>
    main()
  File "TimeSeries.py", line 56, in main
    TimeSeries_dataframe = generate_timeSeries(unicoded_file)
  File "TimeSeries.py", line 23, in generate_timeSeries
    df.loc[df['C_Numbers']=='\xc2\xa0', 'C_Numbers' ] = '0'
  File "/usr/lib/python2.7/dist-packages/pandas/core/ops.py", line 563, in wrapper
    res = na_op(values, other)
  File "/usr/lib/python2.7/dist-packages/pandas/core/ops.py", line 532, in na_op
    raise TypeError("invalid type comparison")
TypeError: invalid type comparison
并得到如下结果:

['163' '143' '51' '43' '34' '24' '20' '15' '14' '12' '11' '10' '9' '8' '7'
 '6' '5' '4' '3' '2' '1' '\xc2\xa0' '145' '35' '16' '164' '146' '36' '21'
 '165' '148' '37' '171' '154' '52' '44' '22' '17' '13' '158' '160' '147'
 '161']
所以我相信,'\xc2\xa0'是罪魁祸首,尽管重复使用UTF-8编码。因此,我在函数
generate\u timeSeries()
中添加了以下两行:

虽然这似乎是具有
'\xc2\xa0'
的文件的临时解决方案,但对于不具有这些字符的文件来说,这似乎是一个问题,因为它会导致以下错误跟踪:

Traceback (most recent call last):
  File "Error_AuthorTimeSeries.py", line 43, in <module>
    main()
  File "Error_AuthorTimeSeries.py", line 33, in main
    TimeSeries_dataframe = generate_timeSeries(unicoded_file)
  File "Error_AuthorTimeSeries.py", line 16, in generate_timeSeries
    timestamps = df.pivot_table('C_Number',['A_ID', 'P_ID'], 'Time Stamp')
  File "/usr/lib/python2.7/dist-packages/pandas/tools/pivot.py", line 104, in pivot_table
    agged = grouped.agg(aggfunc)
  File "/usr/lib/python2.7/dist-packages/pandas/core/groupby.py", line 437, in agg
    return self.aggregate(func, *args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/pandas/core/groupby.py", line 1994, in aggregate
    return getattr(self, arg)(*args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/pandas/core/groupby.py", line 452, in mean
    return self._cython_agg_general('mean')
  File "/usr/lib/python2.7/dist-packages/pandas/core/groupby.py", line 1917, in _cython_agg_general
    new_blocks = self._cython_agg_blocks(how, numeric_only=numeric_only)
  File "/usr/lib/python2.7/dist-packages/pandas/core/groupby.py", line 1964, in _cython_agg_blocks
    raise DataError('No numeric types to aggregate')
pandas.core.groupby.DataError: No numeric types to aggregate
Traceback (most recent call last):
  File "imeSeries.py", line 66, in <module>
    main()
  File "TimeSeries.py", line 56, in main
    TimeSeries_dataframe = generate_timeSeries(unicoded_file)
  File "TimeSeries.py", line 23, in generate_timeSeries
    df.loc[df['C_Numbers']=='\xc2\xa0', 'C_Numbers' ] = '0'
  File "/usr/lib/python2.7/dist-packages/pandas/core/ops.py", line 563, in wrapper
    res = na_op(values, other)
  File "/usr/lib/python2.7/dist-packages/pandas/core/ops.py", line 532, in na_op
    raise TypeError("invalid type comparison")
TypeError: invalid type comparison
回溯(最近一次呼叫最后一次):
文件“IMESSeries.py”,第66行,在
main()
文件“TimeSeries.py”,第56行,主
TimeSeries\u dataframe=生成\u TimeSeries(Unicode\u文件)
文件“TimeSeries.py”,第23行,在generate_TimeSeries中
df.loc[df['C_number']='\xc2\xa0','C_number']='0'
包装器中的文件“/usr/lib/python2.7/dist-packages/pandas/core/ops.py”,第563行
res=na_op(值,其他)
文件“/usr/lib/python2.7/dist packages/pandas/core/ops.py”,第532行,na_op
raise TypeError(“类型比较无效”)
TypeError:类型比较无效
解决此问题的正确方法是什么?


任何帮助都将不胜感激。

我通过在原始脚本中添加以下行,成功地解决了这个问题

df = df.convert_objects(convert_numeric=True)

请显示输入csv的一些行。似乎它被识别为文本。哦,我明白了,你在那列有一些字形。用空值替换这些值(导入到pandas之前)?@MKesper如何替换?我不知道他们是什么性格。当我在像
gedit
这样的文本编辑器中打开时,它们显示为空白。你能试试数据框之类的东西吗?fillna(0)?@Swarm试过了。没有帮助。同样的错误。