環路

2017-08-04 37 views
0

修改DataFrames鑑於這個數據幀:環路

import pandas as pd 
df=pd.DataFrame({'A':[1,2,3],'B':[4,5,6],'C':[7,8,9]}) 
df 
    A B C 
0 1 4 7 
1 2 5 8 
2 3 6 9 

我想創建3個新的數據幀;每列一列。 我可以在這樣的時間這樣做一個:

a=pd.DataFrame(df[['A']]) 
a 
    A 
0 1 
1 2 
2 3 

但不是這樣做的每一列,我希望做一個循環。

這是我已經試過:

a=b=c=df.copy() 
dfs=[a,b,c] 
fields=['A','B','C'] 
for d,f in zip(dfs,fields): 
    d=pd.DataFrame(d[[f]]) 

...但是,當我再打印每一個,我得到了整個原始數據幀,而不是利益只是列。

a 
     A B C 
    0 1 4 7 
    1 2 5 8 
    2 3 6 9 

更新: 我的實際數據幀都會有,我不需要和列不會在任何種類的順序某些列,所以我需要能夠通過名稱來獲取列。

在此先感謝!

回答

1

或者你可以試試這個,而不是創造的df副本,此方法將返回的結果爲單Dataframe,不是list,不過,我想保存Dataframe到一個列表更好

dfs=['a','b','c'] 
fields=['A','B','C'] 
variables = locals() 
for d,f in zip(dfs,fields): 
    variables["{0}".format(d)] = df[[f]] 

a 
Out[743]: 
    A 
0 1 
1 2 
2 3 
b 
Out[744]: 
    B 
0 4 
1 5 
2 6 
c 
Out[745]: 
    C 
0 7 
1 8 
2 9 
+0

後續問題發佈在這裏:https://stackoverflow.com/questions/45511995/pandas-modify-dataframes-in-loop-part-2 –

1

您應該使用loc

a = df.loc[:,0] 

,然後遍歷像

for i in range(df.columns.size): 
    dfs[i] = df.loc[:, i] 
+0

這是矯枉過正考慮到你可以直接迭代列。並使用'df.loc'。 –

+0

啊好吧,是的,你的回答是更好的 –

3

一個簡單的列表理解應該是足夠的。

In [68]: df_list = [df[[x]] for x in df.columns] 

打印出清單,這是你會得到什麼:

In [69]: for d in df_list: 
    ...:  print(d) 
    ...:  print('-' * 5) 
    ...:  
    A 
0 1 
1 2 
2 3 
----- 
    B 
0 4 
1 5 
2 6 
----- 
    C 
0 7 
1 8 
2 9 
----- 

df_list每個元素是它自己的數據幀,相當於從原來的每個數據幀。此外,您甚至不需要fields,而是使用df.columns