【问题标题】:Create folder structure based on values from a pandas dataframe根据 pandas 数据框中的值创建文件夹结构
【发布时间】:2021-07-12 14:04:55
【问题描述】:

我有一个 pandas 数据框,其中包含不同用户的数据以及单个日期的相应值,如下所示:

import pandas as pd
d = {'user': ['Peter', 'Peter', 'Peter', 'Peter', 'David', 'David', 'David', 'Emma', 'Joyce', 'Joyce', 'Joyce'], 'date': ['2019-03-04', '2019-03-04', '2019-03-04', '2019-03-04', '2019-03-04', '2019-03-04', '2019-03-04', '2019-03-04', '2019-03-04', '2019-03-04', '2019-03-04'], 'value': ['5', '4', '3', '3', '6', '1', '5', '7', '1', '7', '6']}
df = pd.DataFrame(data=d)
df

user    date        value
Peter   2019-03-04  5
Peter   2019-03-04  4
Peter   2019-03-04  3
Peter   2019-03-04  3
David   2019-03-04  6
David   2019-03-04  1
David   2019-03-04  5
Emma    2019-03-04  7
Joyce   2019-03-04  1
Joyce   2019-03-04  7
Joyce   2019-03-04  6

使用下面的代码,我可以遍历此数据框并将所有行导出到按用户分组的 csv 文件中。

for i, x in df.groupby('user'):
    p = os.path.join(os.getcwd(), "{}.csv".format(i))
    x.to_csv(p, index=False)

例如,文件Peter.csv 如下所示:

user    date        value
Peter   2019-03-04  5
Peter   2019-03-04  4
Peter   2019-03-04  3
Peter   2019-03-04  3

现在我想将每个用户的这些文件存储在以下文件夹结构中:

Report/
├── Reports per date/ 
│   ├── 2019-03-01/
│   ├── 2019-03-02/
│   ├── 2019-03-03/
│   └── 2019-03-04/
│        └── Users/
│            └── Peter/
│                └── Peter.csv
│            └── David/
│                └── David.csv
│            └── Emma/
│                └── Emma.csv
│            └── Joyce/
│                └── Joyce.csv
│
└── Reports per month/

我知道我可以像这样生成一个以每个用户命名的文件夹:

import os
root_path = '/root/path/'
users_dirs = df['user'].unique().tolist()
for folder in users_dirs:
    os.mkdir(os.path.join(root_path,str(folder)))

但是我很难将这些代码组合起来,以便将每个用户的这些文件存储在上述文件夹结构中。有什么想法吗?

【问题讨论】:

  • 构造路径,使用os.makedirs 传递exist_ok=True 然后为每个用户保存它们。如果date 仅适用于该子文件夹,则也按date 分组。

标签: python pandas dataframe file directory-structure


【解决方案1】:

使用标准库中的pathlib 模块并为每个记录构建目标文件。最后,如果文件夹不存在,则创建文件夹并保存您的用户数据。

import pathlib

rootdir = pathlib.Path('./Report')

report_per_date = df.apply(lambda x: rootdir / 'report_per_date' / x['date'] / 'Users' / x['user'] / f"{x['user']}.csv", axis='columns')

for csvfile, data in df.groupby(report_per_date):
    csvfile.parent.mkdir(parents=True, exist_ok=True)
    data.to_csv(csvfile, index=False) 
$ tree Report
Report/
└── report_per_date
    └── 2019-03-04
        └── Users
            ├── David
            │   └── David.csv
            ├── Emma
            │   └── Emma.csv
            ├── Joyce
            │   └── Joyce.csv
            └── Peter
                └── Peter.csv

7 directories, 4 files

【讨论】:

  • 我很难将此解决方案应用到我要保存的四个单独的 .html folium 地图(David.htmlEmma.htmlJoyce.htmlPeter.html)的情况对应的名称文件夹。见this question。有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 2017-10-22
  • 1970-01-01
  • 2022-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-24
  • 1970-01-01
相关资源
最近更新 更多