在Pandas中使用多个数据帧的优雅方式

时间:2017-12-27 11:11:58

标签: python python-3.x pandas

我有一些目前看起来像这样的代码:

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循环?谢谢!

1 个答案:

答案 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)