在使用pandas导入时忽略字符
我在文档里找不到这样的选项。一个测量设备把所有数据都输出到Excel里:
<> A B C
1
2
3
当我手动删除“<>”这些字符时,一切都正常。那么有没有办法绕过这个问题(不转换成csv格式)呢?
我做的是:
import pandas as pd
df = pd.read_excel(filename,sheetname,skiprows=0,header=0,index_col=0)
skiprow = 1
并不能解决问题,因为pandas会把第一行当作列名。如果我提供names = list(range(1, 4))
,那么第一行的数据就会丢失。
5 个回答
我也遇到过同样的问题。我的第一行是:
# id ra dec ...
这里的#
是Python中的注释符号。import_csv
把#
当成了列标题,但其实它不是。
我用的解决办法是手动定义标题:
headerlist = ['id', 'ra', 'dec', ...]
df = pd.read_csv('data.txt', index_col=False, header=0, names=headerlist)
需要注意的是,index_col
在这个问题上是可选的。
如果有办法忽略标题行中的某个字符,我还没有找到。希望这个解决方案能够进一步改进。
Pandas的read_csv()
函数支持使用regex
(正则表达式)。你可以避免匹配前面有特定字符的空格,比如在你的例子中是#。举个例子,避免匹配“!”:
sep='(?<!\\!)\s+'
如果你愿意,可以重命名这个列,去掉开头的字符和空格。
祝好!
我也遇到了同样的问题。我的第一行是
# id x y ...
所以pandas的header关键字没有效果。我看了两遍后做了以下操作:
cos_phot_header = pd.read_csv(table, delim_whitespace=True, header=None, engine='python', nrows=1)
cos_plot_text_header = cos_phot_header.drop(0, axis=1).values.tolist()
cos_phot_data = pd.read_csv(table, skip_blank_lines=True, comment='#',
delim_whitespace=True, header=None, engine='python', names=cos_plot_text_header[0])
我不明白为什么pandas里没有这样的选项来解决这个问题,这真的是一个大家都会碰到的常见问题。你也可以用不读取任何行(nrows=0)的方式来读取表格,然后使用.columns,但老实说,我觉得这也是一个同样不太好的解决办法。
另一种选择是:
f = open(fname, 'r')
line1 = f.readline()
data1 = pd.read_csv(f, sep='\s+', names=line1.replace(' #', '').split(), dtype=np.float)
不过你可能会用不同的分隔符。
接着 Peruz 的回答,来详细讲讲:
在你的情况下,可以使用正则表达式(regex)来处理。
df = pd.read_csv(filename, sep="(?<!<>)\s+", engine='python')
这样可以正确读取列,除了第一列会被命名为 <> A
。
如果想要更改这个名字,只需修改第一列的名称。
df.columns = pd.Series(df.columns.str.replace("<>\s", ""))
在这个正则表达式中,\s+
表示匹配任意数量的空格字符,但如果前面有我们在负向前瞻中提到的内容,就不匹配。