根据 pandas 数据框中的值创建文件夹结构
Create folder structure based on values from a pandas dataframe
我有一个 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)))
但我很难将这些代码组合起来,以便将每个用户的这些文件存储在上述文件夹结构中。有什么想法吗?
使用标准库中的 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
我有一个 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)))
但我很难将这些代码组合起来,以便将每个用户的这些文件存储在上述文件夹结构中。有什么想法吗?
使用标准库中的 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