2016-10-18 121 views
3

隨着代碼的每次運行,我的年齡,身高和體重列的排序都在變化。我需要保持我的agg列的順序是靜態的,因爲我最終根據列位置引用這個輸出文件。我能做些什麼來確保每次都以相同的順序輸出年齡,身高和體重?pandas - agg()函數

d = pd.read_csv(input_file, na_values=['']) 
df = pd.DataFrame(d) 
df.index_col = ['name', 'address'] 

df_out = df.groupby(df.index_col).agg({'age':np.mean, 'height':np.sum, 'weight':np.sum}) 
df_out.to_csv(output_file, sep=',') 

回答

6

我認爲你可以使用子集:

df_out = df.groupby(df.index_col) 
      .agg({'age':np.mean, 'height':np.sum, 'weight':np.sum})[['age','height','weight']] 

您也可以使用pandas功能:

df_out = df.groupby(df.index_col) 
      .agg({'age':'mean', 'height':sum, 'weight':sum})[['age','height','weight']] 

樣品:

df = pd.DataFrame({'name':['q','q','a','a'], 
        'address':['a','a','s','s'], 
        'age':[7,8,9,10], 
        'height':[1,3,5,7], 
        'weight':[5,3,6,8]}) 

print (df) 
    address age height name weight 
0  a 7  1 q  5 
1  a 8  3 q  3 
2  s 9  5 a  6 
3  s 10  7 a  8 
df.index_col = ['name', 'address'] 
df_out = df.groupby(df.index_col) 
      .agg({'age':'mean', 'height':sum, 'weight':sum})[['age','height','weight']] 

print (df_out) 
       age height weight 
name address      
a s  9.5  12  14 
q a  7.5  4  8 

編輯的建議 - 增加reset_index , H ERE as_index=False不一樣,如果工作需要索引值過:

df_out = df.groupby(df.index_col) 
      .agg({'age':'mean', 'height':sum, 'weight':sum})[['age','height','weight']] 
      .reset_index() 

print (df_out) 
    name address age height weight 
0 a  s 9.5  12  14 
1 q  a 7.5  4  8 
+0

請檢查我的編輯。 – jezrael

0

如果你關心主要是關於當寫到一個文件,而不是同時其仍處於數據幀的對象,你可以設置to_csv()方法的columns參數的順序:

>>> df = pd.DataFrame(
     {'age': [28,63,28,45], 
     'height': [183,156,170,201], 
     'weight': [70.2, 62.5, 65.9, 81.0], 
     'name': ['Kim', 'Pat', 'Yuu', 'Sacha']}, 
     columns=['name','age','weight', 'height']) 
>>> df 
    name age weight height 
0 Kim 28 70.2  183 
1 Pat 63 62.5  156 
2 Yuu 28 65.9  170 
3 Sacha 45 81.0  201 
>>> df_out = df.groupby(['age'], as_index=False).agg(
     {'weight': sum, 'height': sum}) 
>>> df_out 
    age height weight 
0 28  353 136.1 
1 45  201 81.0 
2 63  156 62.5 
>>> df_out.to_csv('out.csv', sep=',', columns=['age','height','weight']) 

out.csv則是這樣的:

,age,height,weight 
0,28,353,136.10000000000002 
1,45,201,81.0 
2,63,156,62.5