2013-10-22 124 views
24

1)。我有以下示例數據集:在Pandas Groupby函數中重命名列名稱

>>> df 
    ID  Region count 
0 100  Asia  2 
1 101  Europe  3 
2 102   US  1 
3 103  Africa  5 
4 100  Russia  5 
5 101 Australia  7 
6 102   US  8 
7 104  Asia  10 
8 105  Europe  11 
9 110  Africa  23 

我想這組數據集的意見通過ID的地區,總結各組的計數。所以我用了這樣的事情:

>>> print(df.groupby(['ID','Region'],as_index=False).count.sum()) 

    ID  Region count 
0 100  Asia  2 
1 100  Russia  5 
2 101 Australia  7 
3 101  Europe  3 
4 102   US  9 
5 103  Africa  5 
6 104  Asia  10 
7 105  Europe  11 
8 110  Africa  23 

使用as_index =假,我能得到一個「類似SQL的」輸出。我的問題是我無法在這裏重命名聚合變量計數。因此,在SQL中,如果想做的事情上面,我會做這樣的事情:

select ID, Region, sum(count) as Total_Numbers 
from df 
group by ID,Region 
order by ID, Region 

正如我們看到的,它很容易讓我在SQL重命名集合變量「計數」來Total_Numbers。我想在熊貓中做同樣的事情,但無法在groupby函數中找到這樣的選項。有人可以幫忙嗎? 2)。第二個問題和更多的觀察是,是否可以直接使用Pandas dataframe函數中的列名稱,而不用引號將它們括起來?我知道變量名是字符串,所以必須在引號內,但我看到如果使用外部數據框函數,並且作爲一個屬性,我們不需要它們在引號內。就像df.ID.sum()等。只有當我們在DataFrame函數(如df.sort()或df.groupby)中使用它時,我們必須在引號內使用它。這在SQL或SAS或其他語言中實際上有點痛苦,我們只是簡單地使用變量名而不引用它們。對此有何建議?

請在上述兩點(第一個主要的,第二個更多的意見)建議。

感謝

回答

28

對於第一個問題,我認爲答案應該是:

<your DataFrame>.rename(columns={'count':'Total_Numbers'}) 

<your DataFrame>.columns = ['ID', 'Region', 'Total_Numbers'] 

至於第二個我想說的答案是否定的。它可以使用它像因爲python datamodel「df.ID」:

屬性的訪問被翻譯成這本詞典的查找, 例如,m.x相當於爲m。 字典 [「X」]

+0

Thxs爲響應。重命名的事情有所幫助,除了我想在第一個語法中我們還需要提及columns = ..所以,<您的DataFrame> .rename(columns = {'count':'Total_Numbers' })。否則它會將其作爲索引並且不會更改列名稱。第二件事完美地起作用,但是如果需要重新命名一個或兩個變量,那麼我想第一個更方便,而不是提到第二個語法中的所有變量名。 我希望如果groupby有東西,但看起來沒有。我也理解熊貓df是一個詞典內在。希望在熊貓中有一定的靈活性 – Baktaawar

14

的電流(如0.20版本)方法用於GROUPBY操作之後改變列名是鏈中的rename方法。有關更多詳細信息,請參閱文檔中的this deprecation note

已過時的答案的大熊貓版本0.20

這是谷歌的第一個結果,雖然頂端回答工作它並沒有真正回答這個問題。關於將字典傳遞給agg方法的全部功能,有一個better answer here和一個長discussion on github

這些答案不幸在文檔中不存在,但分組,聚合和重命名列的一般格式使用字典詞典。外部字典的鍵是要彙總的列名。內部字典具有新值列作爲聚合函數的鍵值。

在我們到那裏之前,讓我們創建一個四列DataFrame。

df = pd.DataFrame({'A' : list('wwwwxxxx'), 
        'B':list('yyzzyyzz'), 
        'C':np.random.rand(8), 
        'D':np.random.rand(8)}) 

    A B   C   D 
0 w y 0.643784 0.828486 
1 w y 0.308682 0.994078 
2 w z 0.518000 0.725663 
3 w z 0.486656 0.259547 
4 x y 0.089913 0.238452 
5 x y 0.688177 0.753107 
6 x z 0.955035 0.462677 
7 x z 0.892066 0.368850 

比方說,我們要通過列A, B和聚合列Cmeanmedian和聚合列Dmax。下面的代碼會做到這一點。

df.groupby(['A', 'B']).agg({'C':['mean', 'median'], 'D':'max'}) 

      D   C   
      max  mean median 
A B        
w y 0.994078 0.476233 0.476233 
    z 0.725663 0.502328 0.502328 
x y 0.753107 0.389045 0.389045 
    z 0.462677 0.923551 0.923551 

這將返回一個帶有分層索引的DataFrame。最初的問題是關於在同一步驟中重命名列的問題。這是可能的使用詞典的詞典:

df.groupby(['A', 'B']).agg({'C':{'C_mean': 'mean', 'C_median': 'median'}, 
          'D':{'D_max': 'max'}}) 

      D   C   
     D_max C_mean C_median 
A B        
w y 0.994078 0.476233 0.476233 
    z 0.725663 0.502328 0.502328 
x y 0.753107 0.389045 0.389045 
    z 0.462677 0.923551 0.923551 

這將重命名列的所有一氣呵成,但仍有其頂層可以df.columns = df.columns.droplevel(0)被丟棄的分級指數。

相關問題