2016-12-28 93 views
1

考慮的3種類型的字典和3個空DataFrames蟒蛇大熊貓 - 編輯多個DataFrames用一個for循環

dict0={'actual': {'2013-02-20 13:30:00': 0.93}} 
dict1={'actual': {'2013-02-20 13:30:00': 0.85}} 
dict2={'actual': {'2013-02-20 13:30:00': 0.98}} 
dicts=[dict0, dict1, dict2] 

df0=pd.DataFrame() 
df1=pd.DataFrame() 
df2=pd.DataFrame() 
dfs=[df0, df1, df2] 

我想遞歸地修改循環中的3個Dataframes以下2所列出,使用以下行:

for df, dikt in zip(dfs, dicts): 
    df = df.from_dict(dikt, orient='columns', dtype=None) 

然而,試圖檢索環路外的DF的​​實例1時,它仍然是空

print (df0) 

將返回

Empty DataFrame 
Columns: [] 
Index: [] 

當從內部for循環打印DF,我們可以看到數據正確,雖然追加。

如何製作循環以便可以在循環外打印3個dfs的變化?

回答

2

在你的循環中,df只是一個臨時值,而不是對相應列表元素的引用。如果您想在迭代列表時修改列表,則必須按索引引用列表。你可以用Python的枚舉來做到這一點:

for i, (df, dikt) in enumerate(zip(dfs, dicts)): 
    dfs[i] = df.from_dict(dikt, orient='columns', dtype=None) 
0

我沒有解釋爲什麼是這樣。然而一個解決方法是:

dict0={'actual': {'2013-02-20 13:30:00': 0.93}} 
dict1={'actual': {'2013-02-20 13:30:00': 0.85}} 
dict2={'actual': {'2013-02-20 13:30:00': 0.98}} 
dicts=[dict0, dict1, dict2] 

dfs = [] 

for dikt in dicts: 
    df = df.from_dict(dikt, orient='columns', dtype=None) 
    dfs.append(df) 

現在

dfs[0] 

回報

     actual 
2013-02-20 13:30:00 0.93 
+0

離開這個在這裏,但@Blackecho好得多 – bouletta

1

你需要保持的參考DF對象,所以你可以嘗試:

for idx, dikt in enumerate(dicts): 
    dfs[idx] = dfs[idx].from_dict(dikt, orient='columns', dtype=None) 
2

這將完成地點!!!
3驚呼

一個襯墊

[dfs[i].set_value(r, c, v) 
for i, dn in enumerate(dicts) 
for r, dr in dn.items() 
for c, v in dr.items()]; 

起來更直觀

for d, df in zip(dicts, dfs): 
    temp = pd.DataFrame(d).stack() 
    for (r, c), v in temp.iteritems(): 
     df.set_value(r, c, v) 

df0 

        actual 
2013-02-20 13:30:00 0.93 

等量替代
沒有pd.DataFrame建設

for i, dn in enumerate(dicts): 
    for r, dr in dn.items(): 
     for c, v in dr.items(): 
      dfs[i].set_value(r, c, v) 

這是爲什麼不同?
到目前爲止,所有其他答案都會將新數據框重新分配到數據框列表中的必需位置。他們打破了那裏的數據框。原始數據框保留爲空,而新的非空列表保留在列表中。

該解決方案就地編輯數據幀,確保原始數據框更新爲新信息。

每OP:

然而,試圖檢索環路外的DF的​​實例1時,它仍然是空


時機
這也相當快

enter image description here


設置

dict0={'actual': {'2013-02-20 13:30:00': 0.93}} 
dict1={'actual': {'2013-02-20 13:30:00': 0.85}} 
dict2={'actual': {'2013-02-20 13:30:00': 0.98}} 
dicts=[dict0, dict1, dict2] 

df0=pd.DataFrame() 
df1=pd.DataFrame() 
df2=pd.DataFrame() 
dfs=[df0, df1, df2] 
+0

你的三個for循環解決不必要的解構現有類型的字典。 – 2016-12-29 00:24:07

+0

@fuzzyhedge否,它不,我需要得到這些鍵和值,以便使用'set_value'。使用'set_value'或'pd.DataFrame.at'或'pd.DataFrame.loc'是我能想到的編輯數據幀的唯一選項。爲了得到那些行,列,值組合,我不得不迭代。我本可以使用一個數據幀構造函數來遍歷它,但這是不必要的。 – piRSquared

0

一行。

>>>df_list = [df.from_dict(dikt, orient='columns', dtype=None) for (df, dikt) in zip(dfs, dicts)] 

>>>df_list 
[      actual 
2013-02-20 13:30:00 0.93, 
         actual 
2013-02-20 13:30:00 0.85, 
         actual 
2013-02-20 13:30:00 0.98] 

>>>df_list[0] 
        actual 
2013-02-20 13:30:00 0.93