使用pandas导入时忽略特定字符

3

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

4

以下是关于 Peruz 答案的拓展:

对于您的情况,可以使用正则表达式:

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

这样应该能够正确读取列,但第一列的名称会被命名为<> A

要更改这个问题,只需修改第一列的名称即可:

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

在正则表达式中,\s+ 匹配除了负向先行断言中指定的字符以外的任意数量的空格字符。


1
另一个选项可能是:

(保留HTML标记)。

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

你可能有不同的分隔符。

1
Pandas的read_csv()支持正则表达式。您可以避免匹配前面有某些内容(在您的情况下是#)的空格。仅举一个例子,避免“!”:
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,但是说实话,我认为这同样是一个解决问题的丑陋方法。


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是可选的。
如果有任何忽略标题行中某个特定字符的选项,我还没有找到它。希望这个解决方案可以得到改进。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接