2017-06-01 155 views
0

我有我在劇本早期定義了不少dataframes,我想在它們之間迭代和修改它們像這樣列表:循環通過和修改的變量

for df in [df_fap, df_spf, df_skin, ...]: 
    df = df.filter(regex=(assay + r"[0-9]+")) 

然而,這是行不通的。循環結束時,數據幀的值不會被修改。我偶然發現了這個post,它有點類似(除了我事先定義了我的變量),但它並沒有提供解決我的確切問題的方法。謝謝!

+0

不,我沒有得到一個錯誤。一旦循環結束,數據框就完全不被修改。例如,'df_fap'有一個'NC-1'列,它應該被刪除(並且它是在我做'df_fap = df_fap.filter(regex =(assay + r「[0-9] +」))''但是在上面的腳本中不會被刪除。 – quantik

+0

@Remolten不,它不應該。 – khelwood

+0

是的,因爲分配不會修改任何內容。 –

回答

1

的循環變量df依次分配列表中的每個元素。如果您重新分配df,那麼您已使df引用其他內容。它不會影響列表。

在遍歷列表時重新分配循環變量不會更改列表,更不用說更改用於填充列表的變量。

試試list comprehension

new_list = [df.filter(whatever) for df in (df_fap, df_spf, df_skin, ...)] 

然後,如果您也想重新分配你的出發變量,你可以使用:

df_fap, df_spf, df_skin, ... = [df.filter(whatever) for df in (df_fap, df_spf, df_skin, ...)] 
+0

我很困惑我在做什麼的方式發生了什麼。列表中的元素會被臨時修改?他們只是佔位符? 然後當下一個元素被調用時會發生什麼變化? – quantik

+1

你這樣做的方式,列表不會被修改。只有'df'變量被改變來引用不同的東西。 – khelwood

0

嘗試

for i in range(len(df_list)): 
    df_list[i] = df_list[i].filter(...) 
+0

啊,我想這樣做,而沒有事先定義列表。不知道是否有可能。編輯:試過。這不起作用 – quantik

1

所以你必須:

df_fap, df_spf, df_skin, ... = new_list 

你甚至可以在一杆做這兩個操作您的變量列表

[df_fap, df_spf, df_skin, ...] 

當你循環您建立了一個新的變量

for df in [df_fap, df_spf, df_skin, ...]: 
    df = value 

每次迭代(循環)是正在重置DF的值,也就是說不關你的變量會改變

答案khelwood給了意味着你「會重新聲明所有的變量,並在一個

df_fap, df_spf, df_skin, ... = [df_fap, df_spf, df_skin, ...] 

應用過濾器嘗試做這樣的事情

a,b = ["apple","banana"] 

在您的控制檯和khelwood的解釋將有道理