我有一些目前看起来像这样的代码:
if os.path.isfile('D:\\df_1'):
df_1 = pd.read_pickle('D:\\df_1')
else:
df_1 = pd.DataFrame(columns = ['Date', 'Location', 'Product'])
if os.path.isfile('D:\\df_2'):
df_2 = pd.read_pickle('D:\\df_2')
else:
df_2 = pd.DataFrame(columns = ['Date', 'Location', 'Product'])
[...]
if os.path.isfile('D:\\df_20'):
df_20 = pd.read_pickle('D:\\df_20')
else:
df_20 = pd.DataFrame(columns = ['Date', 'Location', 'Product'])
基本上我正在做的是检查Dataframe是否已经存在,是否加载它,否则创建一个空数据帧。我需要这个,因为代码将尝试将新数据附加到每个数据帧。所以我会有类似的东西:
[retrieve new data and clean it]
df_1 = pd.concat([df_1, df_1_new_data])
为我拥有的所有20个数据框执行此操作(它们包含不同的内容,因此我希望将它们分开),然后保存它们以便在第二天再次检索它们并向其中添加新数据:
df_1.to_pickle('D:\\df_1')
df_2.to_pickle('D:\\df_2')
[...]
df_20.to_pickle('D:\\df_20')
现在,使用20个数据帧完成它已经非常繁重,但我可能需要添加更多!有没有办法读取不同的数据帧,然后将它们写入for循环中的pickle或类似的东西?那么为了减少我现在的许多代码行到一个简单的2行for循环?谢谢!
答案 0 :(得分:3)
DRY:你不应该多次写同样的东西(真的不止一次)。
使用函数,循环,其他基本语言工具。
def create_df(path):
if os.path.isfile(path):
df = pd.read_pickle(path)
else:
df = pd.DataFrame(columns = ['Date', 'Location', 'Product'])
return df
all_paths = (...)
# dict where key is you path and value is dataframe
all_df = {p: create_df(p) for p in all_paths}
for p in all_paths:
all_df[p].to_pickle(p)