我正在尝试删除或删除使用熊猫读取的数据标头。一个文件具有标题,而另一个则没有,但是我希望能够检查标题然后将其删除。
到目前为止,我已经尝试在read_csv函数中使用header = None
from pathlib import Path
import pandas as pd
def _reader(fname):
return pd.read_csv(fname, sep="\t", header=None)
folder = Path("C:\\Me\\Project1")
data = pd.concat([
_reader(txt)
for txt in folder.glob("*.txt")
])
我收到以下错误: TypeError:必须为str,而不是int
我的两个文件如下:
File1.txt
ISIN AVL_QTY
BAD 90000
AAB 8550000
BAD 173688
BAD 360000
BAD 90000
BAD 810000
BAD 900000
BAD 900000
File2.txt
TEST 543
HELLO 555
STOCK 900
CODE 785
答案 0 :(得分:0)
File2.txt
没有标题,对吗?但您在_reader
中将header
设置为None
。
将标头添加到File2.txt,看看会发生什么。
答案 1 :(得分:0)
有几种方法可以检查csv文件是否具有标题
使用csv库
import csv
with open('example.csv', 'rb') as csvfile:
sniffer = csv.Sniffer()
has_header = sniffer.has_header(csvfile.read(2048))
csvfile.seek(0)
# ...
或者如果您知道自己的数据,请检查第一行中是否有数字
is_header = not any(cell.isdigit() for cell in csv_table[0])
或熊猫本身,如果您知道标题可能被称为
df = (pd.read_csv(filename, header=None, names=cols)
[lambda x: np.ones(len(x)).astype(bool)
if (x.iloc[0] != cols).all()
else np.concatenate([[False], np.ones(len(x)-1).astype(bool)])]
)
当然,如果您想先使用命令行对文件进行预处理,则可能会更快。...
答案 2 :(得分:0)
首先,您需要检查第一行是否为标题。例如。您可以检查第一行的任何条目是否均以数字开头,因为这对于列标题而言并不常见。 实际上,在不知道成千上万个文件的情况下,正确的标头检测方法只是在猜测-但这并不是代码中的重点。
要使用标头检测,应该使用普通循环而不是列表推导,以便可以在每次迭代中:1.检查标头2.读取文件并将数据附加到数据帧: / p>
df = pd.DataFrame()
for f in folder.glob("*.txt"):
with open(f) as fin:
chk_lst = next(fin).split()
is_h = not any(v[0].isdecimal() for v in chk_lst)
df = pd.concat([df, pd.read_csv(f, sep='\s+', header=(None, 0)[is_h])], axis=1)
# ISIN AVL_QTY 0 1
# 0 BAD 90000 TEST 543.775
# 1 AAB 8550000 HELLO 555.000
# 2 BAD 173688 STOCK 900.000
# 3 BAD 360000 CODE 785.000
# 4 BAD 90000 NaN NaN
# 5 BAD 810000 NaN NaN
# 6 BAD 900000 NaN NaN
# 7 BAD 900000 NaN NaN
编辑:
要按行连接,可以使用
df = pd.concat([df, pd.read_csv(f, sep='\s+', header=None, skiprows=(0, 1)[is_h])], axis=0, ignore_index=True)
# 0 1
# 0 BAD 90000
# 1 AAB 8550000
# 2 BAD 173688
# 3 BAD 360000
# 4 BAD 90000
# 5 BAD 810000
# 6 BAD 900000
# 7 BAD 900000
# 8 TEST 543
# 9 HELLO 555
# 10 STOCK 900
# 11 CODE 785