[英]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.