【问题标题】:loop through chunks of files of data循环遍历大块数据文件
【发布时间】:2020-04-23 22:37:44
【问题描述】:

我有很多文件,我把它分成五个一组。我想遍历每组块。我不想一一更改元素,因为有超过 500 个组。有没有办法循环遍历它?

import glob
import numpy as np
import pandas as pd

path = r'/Users/Documents/Data'

files= sorted(glob.glob(path + '/**/*.dat', recursive=True))

chunks = [files[x:x+5] for x in range(0, len(files), 5)]. #group 5 files at a time
chunks = [['file1.dat', 'file2.dat', 'file3.data', 'file4.dat', 'file5.dat'], 
['file6.dat', 'file7.dat', 'file8.dat', 'file9.dat', 'file10.dat'], [...]]```

这项工作,但我不想手动更改元素 500 次。

df=[]
for i in chunks[0]: 
    indat = pd.read_fwf(i, skiprows=4, header=None, engine='python')
    indat = df.append(indat)
indat = pd.concat(df, axis=0, ignore_index=False)

我想试试loop

df=[]
for i, file in enumerate(chunks,1):
    indat = pd.read_fwf(file, skiprows=4, header=None, engine='python')
    indat = df.append(indat)

我的尝试给了我以下错误:


  File "/Users/Documents/test.py", line 30, in <module>
    indat = pd.read_fwf(file, skiprows=4, header=None, engine='python')

  File "/opt/anaconda3/lib/python3.7/site-packages/pandas/io/parsers.py", line 782, in read_fwf
    return _read(filepath_or_buffer, kwds)

  File "/opt/anaconda3/lib/python3.7/site-packages/pandas/io/parsers.py", line 431, in _read
    filepath_or_buffer, encoding, compression

  File "/opt/anaconda3/lib/python3.7/site-packages/pandas/io/common.py", line 200, in get_filepath_or_buffer
    raise ValueError(msg)

ValueError: Invalid file path or buffer object type: <class 'list'>```

【问题讨论】:

  • 为什么你声明chunks只是为了立即覆盖它?与indat 相同
  • 你想要内存中的所有数据帧吗?

标签: python-3.x pandas loops


【解决方案1】:

如果你想要一个数据帧中的所有数据

  • 没有理由将其分成 5 个一组
  • 使用pathlib,它是标准库的一部分,将路径视为对象,而不是字符串
  • 使用[pd.read_fsf(file) for file in files]concat 创建数据框列表。
  • axis=0, ignore_index=False 不包括在内,因为它们是默认值
from pathlib import Path
import pandas as pd

f_path = Path('c:/Users/.../Documents/Data')
files = sorted(list(f_path.glob('**/*.dat')))

df = pd.concat([pd.read_fsf(file, skiprows=4, header=None, engine='python') for file in files])

如果您想要每个组的数据框

  • 使用dict-comprehension 创建数据帧的dict
df_dict = {f'group_{i}': pd.concat([pd.read_fsf(file, skiprows=4, header=None, engine='python') for file in chunk]) for i, chunk in enumerate(chunks)}

【讨论】:

  • 谢谢,第二个选项就是我想要的。当我print(df_dict) 我会得到group_0, group_1, group_10, group_2 有没有办法以数字形式做到这一点? @TrentonMcKinney
  • 如果您更新到 python 3.6 或更高版本,将自动订购字典或尝试从此处订购字典的解决方案:stackoverflow.com/questions/15711755/…
猜你喜欢
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-28
  • 1970-01-01
  • 2014-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多