簡體   English   中英

在對 Pandas 數據幀進行 groupby 操作期間,為無法聚合的列保留數據的最佳方法是什么?

[英]What is the best way to retain data for columns that can't be aggregated during a a groupby operation on a pandas dataframe?

Pandas 數據幀非常適合存儲非同類數據類型,groupby 方法為聚合數據增加了很多靈活性; 但是,我經常想保留執行 groupby 操作后無法聚合的底層數據。

示例

讓我們使用以下數據框:

df_cars = pd.DataFrame({
          'brand': ['Porsche', 'Porsche', 'Porsche', 'BMW' ,'BMW' ,'BMW'],
          'model': ['911 GT3', '911', '911', 'M3', 'M3', 'M3', ],
          'speed(mph)': [100, 120, 110, 70, 80, 90]})

如果我要運行以下代碼:

df_cars.groupby('brand').mean()

我會得到每個品牌的平均速度(英里/小時); 但是,我會丟失模型和品牌列中的基礎數據。

為了保留該信息並執行相同的均值計算,我需要運行以下代碼:

df_cars.groupby('brand').agg({
                        'speed(mph)':'mean', 
                        'model': lambda x: x.iloc[0] if x.nunique() == 1 else list(x),
                        'brand': lambda x: x.iloc[0] if x.nunique() == 1 else list(x)
                        })

這將返回一個數據幀,其平均值是基於每個品牌計算的,並將基礎數據(現在已折疊)保留在結果數據幀中。

這是保留這些信息的最有效方式嗎? 此外,為什么這不是 groupby 的默認實現中的一個選項,以便更輕松地保留無法聚合的數據?

首先,當您聚合數據時,根據定義,您將丟失信息,因為您正在匯總數據集。

也就是說,我看到您在這里有兩個選擇:

1. 簡化您的代碼並應用正確的方法:

df_cars.groupby('brand', as_index=False).agg({
    'speed(mph)': 'mean',
    'model': 'unique'
})

     brand  speed(mph)           model
0      BMW          80            [M3]
1  Porsche         110  [911 GT3, 911]

或者,如果您不希望您的對象類型列出現在列表中:

df_cars.groupby('brand', as_index=False).agg({
    'speed(mph)': 'mean',
    'model': lambda x: ','.join(np.unique(x))
})

     brand  speed(mph)        model
0      BMW          80           M3
1  Porsche         110  911,911 GT3

2. 按列類型拆分數據並應用簡單聚合:

這適用於具有多個對象和數字列的較大數據框

df_cars = df_cars.set_index('brand')
text = df_cars.select_dtypes('object')
numeric = df_cars.select_dtypes(exclude='object')

g1 = text.groupby('brand')
g2 = numeric.groupby('brand')

dfn = g1.agg(np.unique).join(g2.mean()).reset_index()

     brand           model  speed(mph)
0      BMW              M3          80
1  Porsche  [911, 911 GT3]         110

暫無
暫無

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

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