我有一组像这样的文本文件:
ID对应的文件
A
<empty line>
#-----------------------------------------
# foo bar baz
#-----------------------------------------
0.0120932 1.10166 1.08745
0.0127890 1.10105 1.08773
0.0142051 1.09941 1.08760
0.0162801 1.09662 1.08548
0.0197376 1.09170 1.08015
ID对应的文件
B
<empty line>
#-----------------------------------------
# foo bar baz
#-----------------------------------------
0.888085 0.768590 0.747961
0.893782 0.781607 0.760417
0.899830 0.797021 0.771219
0.899266 0.799260 0.765859
0.891489 0.781255 0.728892
等等
我想将它们全部读入
pandas
数据框,其列是['ID', 'foo', 'bar', 'baz']
。通常,当我想逐行创建数据帧时,我将每一行作为字典读取并附加到列表,然后将字典列表转换为数据帧。然而,这个技巧在这里不起作用,因为每个字典都包含多个行。我该如何解决这个问题?
假设您的文件名为
A.csv
/B.csv
,您可以使用自定义函数和 glob
。在函数中使用 pandas.read_csv
和 skiprows
(自定义分隔符)并提供预期的名称:
from glob import glob
from pathlib import Path
files = glob('*.csv')
# or from an explicit list:
# files = ['A.csv', 'B.csv']
def read_file(path, skip=4, names=['foo', 'bar', 'baz']):
stem = Path(path).stem
return (stem,
pd.read_csv(path, skiprows=skip, sep=r'\s+',
names=names)
.assign(ID=stem)[['ID']+names]
)
dfs = dict(map(read_file, files))
输出:
{'A': ID foo bar baz
0 A 0.012093 1.10166 1.08745
1 A 0.012789 1.10105 1.08773
2 A 0.014205 1.09941 1.08760
3 A 0.016280 1.09662 1.08548
4 A 0.019738 1.09170 1.08015,
'B': ID foo bar baz
0 B 0.888085 0.768590 0.747961
1 B 0.893782 0.781607 0.760417
2 B 0.899830 0.797021 0.771219
3 B 0.899266 0.799260 0.765859
4 B 0.891489 0.781255 0.728892}