Unstack/split 数据帧并将数据帧的 parts/chunks 写入分配给键的多个 csv
Unstack/split dataframe and write parts/chunks of dataframe to multiple csv's assigned to keys
问题
我正在读取多个匹配特定模式的 csv,将它们连接到一个数据帧中并在该帧内进行一些处理(例如填充日期时间间隙、构建平均值等)。在下一步中,我尝试拆开数据框,并将它们写入单独的 csv 文件(将它们命名为导入的文件 + 扩展名)到它们从中导入的同一目录。
连接后的处理数据框如下所示:
Datetime Value
0 2017-03-03 12:15:00 2.3
1 2017-03-03 12:30:00 2.1
...
n 2017-12-19 12:15:00 5.3
0 2017-05-03 12:15:00 1.3
1 2017-05-03 12:30:00 3.1
...
m 2017-12-19 12:15:00 7.3
...
到目前为止我的代码:
import os
import glob
import pandas as pd
pattern = "*whatever*.csv"
directory_path = "mypath"
files = glob.iglob(directory_path + '/**/' + pattern, recursive=True)
def get_files():
dfs = (pd.read_csv(filename)
for filename in files)
df = pd.concat(dfs)
def process_df():
.... # do some processing
return processed_df
'''this part of code does basically what i want'''
def write_to_csv()
dict_ = {}
for filename in files:
dict_[file] = pd.read_csv(file)
for file in dict_:
with open(os.path.splitext(file)[0] + "_gaps_filled.csv", 'w') as f:
dict_[filename].to_csv(f, sep=',', index=False, header=False)
def write_to_csv()
基本上想要我想要的未连接/处理的数据。
问题
split/unstack 连接处理的数据帧如何将正确的文件名分配给 unstacked/splitted 块并循环写入 csv 文件?
*期望的结果
将匹配的csv文件读入dataframe--->处理dataframe--->将处理后的chunk写入相应的csv文件名和目录
a.csv a some data a_pro.csv
b.csv to df-------> some data process--->[] to_csv--> b_pro.csv
c.csv ... c_pro.csv
b some data
some data
...
c some data
some data
...
我的方法
我尝试设置键 (pd.concat(dfs, keys=filenames
),以便我可以将文件名分配给串联数据帧中的相应块。但是在我的 def process_df()
函数中,我使用了 groupby
方法,因此键得到 "lost"。
一个透明的解决方案是在处理过程中简单地添加一个包含文件名的列。
然后,当你想输出到单独的文件时,只需按文件名过滤并相应地输出。
您的代码可能如下所示:
dfs = {i: pd.read_csv(i).assign(filename=i) for i in filenames}
df = pd.concat(dfs.values(), ignore_index=True)
# do your processing here
for k in filenames:
df[df['filename'] == k].drop('filename', 1).to_csv(k+'pro', index=False)
问题
我正在读取多个匹配特定模式的 csv,将它们连接到一个数据帧中并在该帧内进行一些处理(例如填充日期时间间隙、构建平均值等)。在下一步中,我尝试拆开数据框,并将它们写入单独的 csv 文件(将它们命名为导入的文件 + 扩展名)到它们从中导入的同一目录。 连接后的处理数据框如下所示:
Datetime Value
0 2017-03-03 12:15:00 2.3
1 2017-03-03 12:30:00 2.1
...
n 2017-12-19 12:15:00 5.3
0 2017-05-03 12:15:00 1.3
1 2017-05-03 12:30:00 3.1
...
m 2017-12-19 12:15:00 7.3
...
到目前为止我的代码:
import os
import glob
import pandas as pd
pattern = "*whatever*.csv"
directory_path = "mypath"
files = glob.iglob(directory_path + '/**/' + pattern, recursive=True)
def get_files():
dfs = (pd.read_csv(filename)
for filename in files)
df = pd.concat(dfs)
def process_df():
.... # do some processing
return processed_df
'''this part of code does basically what i want'''
def write_to_csv()
dict_ = {}
for filename in files:
dict_[file] = pd.read_csv(file)
for file in dict_:
with open(os.path.splitext(file)[0] + "_gaps_filled.csv", 'w') as f:
dict_[filename].to_csv(f, sep=',', index=False, header=False)
def write_to_csv()
基本上想要我想要的未连接/处理的数据。
问题
split/unstack 连接处理的数据帧如何将正确的文件名分配给 unstacked/splitted 块并循环写入 csv 文件?
*期望的结果
将匹配的csv文件读入dataframe--->处理dataframe--->将处理后的chunk写入相应的csv文件名和目录
a.csv a some data a_pro.csv
b.csv to df-------> some data process--->[] to_csv--> b_pro.csv
c.csv ... c_pro.csv
b some data
some data
...
c some data
some data
...
我的方法
我尝试设置键 (pd.concat(dfs, keys=filenames
),以便我可以将文件名分配给串联数据帧中的相应块。但是在我的 def process_df()
函数中,我使用了 groupby
方法,因此键得到 "lost"。
一个透明的解决方案是在处理过程中简单地添加一个包含文件名的列。
然后,当你想输出到单独的文件时,只需按文件名过滤并相应地输出。
您的代码可能如下所示:
dfs = {i: pd.read_csv(i).assign(filename=i) for i in filenames}
df = pd.concat(dfs.values(), ignore_index=True)
# do your processing here
for k in filenames:
df[df['filename'] == k].drop('filename', 1).to_csv(k+'pro', index=False)