簡體   English   中英

Python Pandas:使用groupby()和agg()時是否保留了順序?

[英]Python Pandas: Is Order Preserved When Using groupby() and agg()?

我經常使用pandas的agg()函數來對data.frame的每一列運行匯總統計。 例如,以下是產生均值和標准差的方法:

df = pd.DataFrame({'A': ['group1', 'group1', 'group2', 'group2', 'group3', 'group3'],
                   'B': [10, 12, 10, 25, 10, 12],
                   'C': [100, 102, 100, 250, 100, 102]})

>>> df
[output]
        A   B    C
0  group1  10  100
1  group1  12  102
2  group2  10  100
3  group2  25  250
4  group3  10  100
5  group3  12  102

在這兩種情況下,將各行發送到agg函數的順序無關緊要。 但請考慮以下示例,其中:

df.groupby('A').agg([np.mean, lambda x: x.iloc[1] ])

[output]

        mean  <lambda>  mean  <lambda>
A                                     
group1  11.0        12   101       102
group2  17.5        25   175       250
group3  11.0        12   101       102

在這種情況下,lambda按預期運行,輸出每組中的第二行。 但是,我無法在pandas文檔中找到任何內容,這意味着在所有情況下都保證這是真的。 我想使用agg()和加權平均函數,所以我想確保進入函數的行與它們在原始數據框中出現的順序相同。

有沒有人知道,理想情況下,通過docs或pandas源代碼中的某個地方,如果保證是這樣的話?

請參閱此增強問題

簡短的回答是肯定的,groupby將保留傳入的排序。你可以通過使用你的例子證明這一點:

In [20]: df.sort_index(ascending=False).groupby('A').agg([np.mean, lambda x: x.iloc[1] ])
Out[20]: 
           B             C         
        mean <lambda> mean <lambda>
A                                  
group1  11.0       10  101      100
group2  17.5       10  175      100
group3  11.0       10  101      100

但這不適用於重新采樣,因為它需要單調索引(它將使用非單調索引,但會先對其進行排序)。

它們是groupby的sort=標志,但這與組本身的排序有關,而不是組內的觀察。

僅供參考: df.groupby('A').nth(1)是獲取組的第二個值的安全方法(如果一個組有<2個元素,上面的方法將失敗)

Panda的0.19.1 doc說“groupby保留了每個組中行的順序”,所以這是保證行為。

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.groupby.html

為了保持順序,你需要傳遞.groupby(..., sort=False) 在您的情況下,分組列已經排序,因此它沒有區別,但通常必須使用sort=False標志:

 df.groupby('A', sort=False).agg([np.mean, lambda x: x.iloc[1] ])

更簡單:

  import pandas as pd
  pd.pivot_table(df,index='A',aggfunc=(np.mean))

輸出:

            B    C
     A                
   group1  11.0  101
   group2  17.5  175
   group3  11.0  101

參考: https//pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.groupby.html

API接受“SORT”作為參數。

SORT參數的描述如下:

sort:bool,默認True排序組鍵。 關閉它可以獲得更好的性能。 請注意,這不會影響每組內觀察的順序。 Groupby保留每個組中的行順序

因此,很明顯“Groupby”確實保留了每個組中行的順序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM