2017-12-27 3 views
0

에서 여러 dataframes와 함께 작동합니다 :우아한 방법은 내가 현재 다음과 같습니다 코드의 비트 팬더

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 dataframes에 대해이 작업을 수행 (서로 다른 것들을 포함을, 그래서 나는 분리를 유지하려는), 다음 날 다시 검색하는 순서로 저장 이후 그들에게 새로운 데이터를 추가 : 이제

df_1.to_pickle('D:\\df_1') 
df_2.to_pickle('D:\\df_2') 
[...] 
df_20.to_pickle('D:\\df_20') 

, 이미 20 dataframes 함께 할 아주 무거운, 그러나 나는 아마 좀 더 추가해야합니다! 다른 데이터 프레임을 읽은 다음 for 루프 또는 이와 비슷한 방식으로 피클에 기록 할 수 있습니까? 그래서 많은 사람들을위한 코드 라인을 줄이기 위해 지금은 단순한 2 라인의 루프를 사용하고 있습니까? 고맙습니다!

+0

왜 이런 일을 반복하지 않습니까? –

+0

동적으로 변수 이름을 만들어야하고, 이것이 나쁜 일임을 알고 있습니다. – giga

+0

사전을 사용하십시오. –

답변

2

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) 
관련 문제