在使用pandas导入时忽略字符

3 投票
5 回答
9594 浏览
提问于 2025-04-18 07:19

我在文档里找不到这样的选项。一个测量设备把所有数据都输出到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 个回答

0

我也遇到过同样的问题。我的第一行是:

# 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在这个问题上是可选的。

如果有办法忽略标题行中的某个字符,我还没有找到。希望这个解决方案能够进一步改进。

1

Pandas的read_csv()函数支持使用regex(正则表达式)。你可以避免匹配前面有特定字符的空格,比如在你的例子中是#。举个例子,避免匹配“!”:

sep='(?<!\\!)\s+'

如果你愿意,可以重命名这个列,去掉开头的字符和空格。

祝好!

1

我也遇到了同样的问题。我的第一行是

# 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,但老实说,我觉得这也是一个同样不太好的解决办法。

1

另一种选择是:

f = open(fname, 'r')
line1 = f.readline()
data1 = pd.read_csv(f, sep='\s+', names=line1.replace(' #', '').split(), dtype=np.float)

不过你可能会用不同的分隔符。

4

接着 Peruz 的回答,来详细讲讲:

在你的情况下,可以使用正则表达式(regex)来处理。

df = pd.read_csv(filename, sep="(?<!<>)\s+", engine='python')

这样可以正确读取列,除了第一列会被命名为 <> A

如果想要更改这个名字,只需修改第一列的名称。

df.columns = pd.Series(df.columns.str.replace("<>\s", ""))

在这个正则表达式中,\s+ 表示匹配任意数量的空格字符,但如果前面有我们在负向前瞻中提到的内容,就不匹配。

撰写回答