Python中pandas读取数据时列名与数据不对应的问题如何解决?
只想读取其中的 5 列:1,3,4,5,6
在 jupyter notebook 中执行以下代码
%matplotlib inline
import matplotlib
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
dtype1 ={‘names’:(‘R’,‘c’,‘sigma_r’,‘sigma_t’,‘sigma_h’),‘formats’:(np.float64, np.float64, np.float64, np.float64, np.float64)}
name2 = {‘R’,‘c’,‘sigma_r’,‘sigma_t’,‘sigma_h’}
dtype2 = {‘R’: np.float64,‘c’: np.float64,‘sigma_r’: np.float64,‘sigma_t’: np.float64,‘sigma_h’: np.float64}
a = np.loadtxt(’./TS015.dat’, dtype=dtype1, usecols=(0,2,3,4,5))
data = pd.read_csv("./TS015.dat",skiprows=2,header=0, sep=’\s+’, index_col=None, names=name2, dtype=dtype2, usecols=[0,2,3,4,5])
结果发现数组 a 的结果是对的,而 data 里读取的各列的标题是乱的,并不是我想要的‘ R ’对应于第一列,‘ c ’对应于第二列。不知道是不是 read_csv 函数有什么参数没有设置对?
使用的环境是 Ubuntu 下通过 pyenv 安装的 anaconda3-4.3.1,notebook 信息: Server Information:
You are using Jupyter notebook.
The version of the notebook server is: 5.4.1-bcc8ab2 The server is running on this version of Python:
Python 3.6.4 | packaged by conda-forge | (default, Dec 23 2017, 16:31:06)
[GCC 4.8.2 20140120 (Red Hat 4.8.2-15)]
Current Kernel Information:
Python 3.6.4 | packaged by conda-forge | (default, Dec 23 2017, 16:31:06)
Type 'copyright', 'credits' or 'license' for more information
IPython 6.2.1 -- An enhanced Interactive Python. Type '?' for help.
我另外在 ubuntu17.10 的虚拟机里尝试了同样的代码,read_csv 读取到的结果也不对,names 和列似乎是随意匹配的一样。。。
请各位指正,先谢过。
Python中pandas读取数据时列名与数据不对应的问题如何解决?
我记得 names 需要 list,也就是有序,你这个 set 是无序的
遇到pandas读取数据时列名和数据错位的问题,通常是因为文件首行数据不规范或者分隔符不匹配。核心是检查文件格式,并正确指定header和sep参数。
比如CSV文件首行是数据而非列名,可以设置header=None手动指定列名:
import pandas as pd
# 文件首行是数据的情况
df = pd.read_csv('data.csv', header=None, names=['col1', 'col2', 'col3'])
如果是分隔符问题,比如用制表符分隔却默认逗号:
# 明确指定分隔符
df = pd.read_csv('data.tsv', sep='\t')
还可以跳过不规范行:
# 跳过前两行(如注释行)
df = pd.read_csv('data.csv', skiprows=2)
用pd.read_csv的engine='python'有时能处理不规则分隔符:
df = pd.read_csv('data.csv', engine='python')
检查一下文件前几行和分隔符,调整参数就行。
names 要使用 list 类型,保证有序,楼上两个已经说得清楚了。。。
惭愧,改成 name2 = [‘R’,‘c’,‘sigma_r’,‘sigma_t’,‘sigma_h’]就对了。原来把列表写成字典类型了。对 python 完全没有了解,现照着例子做的,犯了这样的低级错误。非常感谢!


