2015-06-08 26 views
0

這是一個非常基本的問題。我想以某種方式組織一個csv。到目前爲止,我已經達到了我想要的水平,而且速度也非常快。在行中添加一行並在python中排序

import numpy as np 
import pandas as pd 
import pandas.util.testing as tm; tm.N = 3 


data = pd.DataFrame.from_csv('MYDATA.csv') 
byqualityissue = data.groupby(["Name","Type"]).size() 
df = pd.DataFrame(bytype) 

formatted = df.unstack(level=-1) 
formatted[np.isnan(formatted)] = 0 
formatted.to_csv('bytype.csv', header=True) 

byType的是這樣的:

Type   Type1  Type2  Type3 
Name 
Company 1  10   0   3 
Company 2  4    23   3 
Company 3  3    2   0 

不過,我需要它有序,使公司具有最大總(行之和)將在頂部。在這種情況下,它應該是頂部的公司2,然後是公司1,然後是公司3.它應該只選擇前二十個客戶,並由我的其他Python代碼讀取。

Name,   Type1, Type2, Type3 
Company 2,  4,  23,  3 
Company 1,  10,  0,  3 
Company 3,  3,  2,  0 

我認爲最好的辦法是將總數加在另一列然後按降序排序。爲了做到這一點,我寫了這一行:

sorted = np.sum(formatted, axis=1) 

它成功輸出總數。我看着How to add a new column to a CSV file using Python?

所以寫道:

with open('bytype.csv') as csvinput: 
    with open('bytype2.csv','w') as csvoutput: 
     writer = csv.writer(csvoutput, lineterminator='\n') 
     reader = csv.reader(csvinput) 

     all = [] 
     row = next(reader) 
     row.append('Total') 
     all.append(row) 

     for row in reader: 
      row.append(np.sum(formatted, axis=1)) 
      all.append(row) 

     writer.writerows(all) 

但我不僅沒有得到一個輸出bytype2,但這種方法似乎意味着重讀CSV,然後追加列,然後我我們仍然需要對它們進行排序。必須有一個更簡單的方法來做到這一點,我錯過了。

+0

只需將列添加到您的數據幀,DF [關鍵] =我知道什麼 –

+0

@PadraicCunningham它可能是那樣簡單,但究竟如何你加了嗎? df [newkeytitle] =排序?它如何知道數據框中的哪個位置?上週我一直在教自己python,但我還是很新的。 – jenryb

+0

是的,只需使用新的密鑰名稱作爲密鑰,無論您想要添加什麼值,都可以共享一點點,如果您的文件? –

回答

0

在修補了一天後回答了我自己的問題。以下是我添加總計列的方式,然後按該列進行排序。

includingtotals = pd.concat([formatted,pd.DataFrame(formatted.sum(axis=1),columns=['Total'])],axis=1) 
sorted = includingtotals.sort_index(by=['Total'], ascending=[False]) 
sorted.to_csv('byqualityissue.csv', header=True)