pandas替换列名必须列数相同么?

发布于 2021-12-07 02:10:08 字数 3801 浏览 757 评论 11

本人使用pandas.read_csv()读取一个csv文件内容获取得到一个datafame

当我想替换列名的时候我尝试使用传参

opcsv=pandas.read_csv(f,header=0,dtype={'code':str},names=names)

获得一个报错

Traceback (most recent call last):
  File "C:/Users/Administrator/Desktop/computerXP/upEXdate.py", line 74, in <module>
    openfile(inputdir)
  File "C:/Users/Administrator/Desktop/computerXP/upEXdate.py", line 19, in openfile
    openfile(fi_d)
  File "C:/Users/Administrator/Desktop/computerXP/upEXdate.py", line 19, in openfile
    openfile(fi_d)
  File "C:/Users/Administrator/Desktop/computerXP/upEXdate.py", line 24, in openfile
    tab(path,fi)
  File "C:/Users/Administrator/Desktop/computerXP/upEXdate.py", line 45, in tab
    opcsv=pandas.read_csv(f,header=0,dtype={'code':str},names=names)
  File "C:ProgramDataAnaconda3libsite-packagespandasioparsers.py", line 678, in parser_f
    return _read(filepath_or_buffer, kwds)
  File "C:ProgramDataAnaconda3libsite-packagespandasioparsers.py", line 446, in _read
    data = parser.read(nrows)
  File "C:ProgramDataAnaconda3libsite-packagespandasioparsers.py", line 1036, in read
    ret = self._engine.read(nrows)
  File "C:ProgramDataAnaconda3libsite-packagespandasioparsers.py", line 1848, in read
    data = self._reader.read(nrows)
  File "pandas_libsparsers.pyx", line 876, in pandas._libs.parsers.TextReader.read
  File "pandas_libsparsers.pyx", line 891, in pandas._libs.parsers.TextReader._read_low_memory
  File "pandas_libsparsers.pyx", line 968, in pandas._libs.parsers.TextReader._read_rows
  File "pandas_libsparsers.pyx", line 1028, in pandas._libs.parsers.TextReader._convert_column_data
pandas.errors.ParserError: Too many columns specified: expected 104 and found 103

也就是我的csv文件有103列,但是传入的参数name有104个值

当我再尝试使用

opcsv=pandas.read_csv(f,header=0,dtype={'code':str},names=names)
opcsv.columns=names

的时候也是同样的情况

Traceback (most recent call last):
  File "C:/Users/Administrator/Desktop/computerXP/upEXdate.py", line 74, in <module>
    openfile(inputdir)
  File "C:/Users/Administrator/Desktop/computerXP/upEXdate.py", line 19, in openfile
    openfile(fi_d)
  File "C:/Users/Administrator/Desktop/computerXP/upEXdate.py", line 19, in openfile
    openfile(fi_d)
  File "C:/Users/Administrator/Desktop/computerXP/upEXdate.py", line 24, in openfile
    tab(path,fi)
  File "C:/Users/Administrator/Desktop/computerXP/upEXdate.py", line 46, in tab
    opcsv.columns=names
  File "C:ProgramDataAnaconda3libsite-packagespandascoregeneric.py", line 4389, in __setattr__
    return object.__setattr__(self, name, value)
  File "pandas_libsproperties.pyx", line 69, in pandas._libs.properties.AxisProperty.__set__
  File "C:ProgramDataAnaconda3libsite-packagespandascoregeneric.py", line 646, in _set_axis
    self._data.set_axis(axis, labels)
  File "C:ProgramDataAnaconda3libsite-packagespandascoreinternals.py", line 3323, in set_axis
    'values have {new} elements'.format(old=old_len, new=new_len))
ValueError: Length mismatch: Expected axis has 103 elements, new values have 104 elements

 

因为手上有一个项目目录里面的csv表列数稍有不同,最少100列最多104列因此我的思路是按照最长列数来同一读取csv表处理列名,对于100列的csv处理后多出来的4列的值让他都为NAN。

本人也尝试过干脆以100列来处理,但是发现超出100列的csv表会将前面的几列数据抛弃然后整体往前挪动补全(此时我想要的结果应该是抛弃的是后面多出来几列的数据而不是头部的几列数据)

请问有没有相关的处理思路,因为读取了文档和网上搜索都并没有遇见与我现在遇到的相关问题

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(11

看透却不说透 2021-12-08 12:06:23

当我在debug的时候发现了这样的报错

Traceback (most recent call last):
  File "E:Program Files (x86)PyCharm 2018.1.3helperspydevpydevd.py", line 1664, in <module>
    main()
  File "E:Program Files (x86)PyCharm 2018.1.3helperspydevpydevd.py", line 1658, in main
    globals = debugger.run(setup['file'], None, None, is_module)
  File "E:Program Files (x86)PyCharm 2018.1.3helperspydevpydevd.py", line 1068, in run
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "E:Program Files (x86)PyCharm 2018.1.3helperspydev_pydev_imps_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"n", file, 'exec'), glob, loc)
  File "C:/Users/Administrator/Desktop/computerXP/hebing.py", line 2, in <module>
    import pymysql,pandas,os,time,numpy
  File "C:ProgramDataAnaconda3libsite-packagespandas__init__.py", line 19, in <module>
    "Missing required dependencies {0}".format(missing_dependencies))
ImportError: Missing required dependencies ['numpy']

我不知道是否是他的原因

情场扛把子 2021-12-08 12:06:23

我似乎找到了原因

frame = pd.DataFrame(np.arange(9).reshape((3, 3)), index=['a', 'c', 'd'], columns=['c1', 'c2', 'c3']) print frame

因为我本地读取的csv文件是

这样的中文列名,而我需要替换以下列名

因此就好在替换成功的同时将所有原来的数据变为NaN

因为如果从read_csv传参names来更改列名就必须要小于等于csv列数

或者如果只要解决names参数传入的元素少于csv列数dataframe从后抛弃数据这样是否可行?

 

飘过的浮云 2021-12-08 12:06:23
(tf) [root@bogon testpd]# cat test.csv 
A,B,C,D,code
1,2,3,4,23
5,6,7,7,234
23,423,4,21,123
(tf) [root@bogon testpd]# python       
Python 3.6.6 (default, Aug 13 2018, 18:24:23) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas as pd
>>> names = ['A','x','C','D','code','xxx','yyy']
>>> opcsv=pd.read_csv('test.csv', header=0, dtype={'code':str})
>>> opcsv
    A    B  C   D code
0   1    2  3   4   23
1   5    6  7   7  234
2  23  423  4  21  123
>>> opcsv.columns = names[:len(opcsv.columns)]
>>> opcsv
    A    x  C   D code
0   1    2  3   4   23
1   5    6  7   7  234
2  23  423  4  21  123
>>> 
毁梦 2021-12-08 12:06:23

我的天,简直不敢相信,这正是我想要得完美结果,请问您是做了理解pandas多深才做到的。能分享一下您是怎么去剖析pandas得到的

浅沫记忆 2021-12-08 12:06:21

原有的数据也被全部清空赋值NaN了。我不清楚具体原因,我现在正尝试断点debug查看问题所在

英雄似剑 2021-12-08 11:44:53

回复
@007 : 我通过回复成功实现了,但又引发了新的问题

输什么也不输骨气 2021-12-08 11:43:04

是的!这正是我想要的结果,但是不知道为什么我按照您给的代码尝试了一遍发现,列名并没有成功生效。

以下是我打印调试的结果,由上面的list替换下面dataframe的表头

但令我无奈的是他并没有生效,我也不清楚具体的原因

泛滥成性 2021-12-08 08:54:59

是的!这正是我想要的结果,但是不知道为什么我按照您给的代码尝试了一遍发现,列名并没有成功生效。 以下是我打印调试的结果,由上面的list替换下面dataframe的表头 但令我无奈的是他并没有生效,我也不清楚具体的原因

吃颗糖壮壮胆 2021-12-08 06:46:11

看下结果是不是你要的效果

(tf) [root@bogon testpd]# cat test.csv 
A,B,C,D,code
1,2,3,4,23
5,6,7,7,234
23,423,4,21,123
(tf) [root@bogon testpd]# python       
Python 3.6.6 (default, Aug 13 2018, 18:24:23) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas as pd
>>> names = ['A','B','C','D','code','xxx','yyy']
>>> opcsv=pd.read_csv('test.csv', header=0, dtype={'code':str})
>>> opcsv
    A    B  C   D code
0   1    2  3   4   23
1   5    6  7   7  234
2  23  423  4  21  123
>>> newpocsv = opcsv.reindex(columns=names)
>>> newpocsv
    A    B  C   D code  xxx  yyy
0   1    2  3   4   23  NaN  NaN
1   5    6  7   7  234  NaN  NaN
2  23  423  4  21  123  NaN  NaN
>>> 
爱的那么颓废 2021-12-08 06:16:29

请问我不太懂reindex(columns=names)是实现什么的 我尝试了一下似乎没有生效

疑心病 2021-12-08 05:56:29

引用来自“007”的评论

(tf) [root@bogon testpd]# cat test.csv 
A,B,C,D,code
1,2,3,4,23
5,6,7,7,234
23,423,4,21,123
(tf) [root@bogon testpd]# python       
Python 3.6.6 (default, Aug 13 2018, 18:24:23) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas as pd
>>> names = ['A','x','C','D','code','xxx','yyy']
>>> opcsv=pd.read_csv('test.csv', header=0, dtype={'code':str})
>>> opcsv
    A    B  C   D code
0   1    2  3   4   23
1   5    6  7   7  234
2  23  423  4  21  123
>>> opcsv.columns = names[:len(opcsv.columns)]
>>> opcsv
    A    x  C   D code
0   1    2  3   4   23
1   5    6  7   7  234
2  23  423  4  21  123
>>> 
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文