簡體   English   中英

pandas:在分組后按多列創建單個大小和總和列

[英]pandas: create single size & sum columns after group by multiple columns

我有一個數據框,我在3列上進行groupby並聚合數值列的總和和大小。 運行代碼后

df = pd.DataFrame.groupby(['year','cntry', 'state']).agg(['size','sum'])

我得到的東西如下:

datafram的圖像

現在我想從主列拆分大小子列並僅創建單個大小的列,但希望將總和列保留在主列標題下。 我嘗試了不同的方法,但沒有成功。 這些是我嘗試過但無法讓事情適合我的方法:

如何按對象計算pandas組中組的行數?

將Pandas GroupBy對象轉換為DataFrame

如果有人能幫我這個,我將不勝感激。

問候,

建立

d1 = pd.DataFrame(dict(
        year=np.random.choice((2014, 2015, 2016), 100),
        cntry=['United States' for _ in range(100)],
        State=np.random.choice(states, 100),
        Col1=np.random.randint(0, 20, 100),
        Col2=np.random.randint(0, 20, 100),
        Col3=np.random.randint(0, 20, 100),
    ))

df = d1.groupby(['year', 'cntry', 'State']).agg(['size', 'sum'])
df

在此輸入圖像描述


回答
最簡單的方法是只在groupby之后運行size

d1.groupby(['year', 'cntry', 'State']).size()

year  cntry          State        
2014  United States  California       10
                     Florida           9
                     Massachusetts     8
                     Minnesota         5
2015  United States  California        9
                     Florida           7
                     Massachusetts     4
                     Minnesota        11
2016  United States  California        8
                     Florida           8
                     Massachusetts    11
                     Minnesota        10
dtype: int64

要使用計算的df

df.xs('size', axis=1, level=1)

在此輸入圖像描述

如果每列的size不同,那將非常有用。 但是因為['Col1', 'Col2', 'Col3']size列是相同的,我們可以做

df[('Col1', 'size')]

year  cntry          State        
2014  United States  California       10
                     Florida           9
                     Massachusetts     8
                     Minnesota         5
2015  United States  California        9
                     Florida           7
                     Massachusetts     4
                     Minnesota        11
2016  United States  California        8
                     Florida           8
                     Massachusetts    11
                     Minnesota        10
Name: (Col1, size), dtype: int64

綜合觀點1

pd.concat([df[('Col1', 'size')].rename('size'),
           df.xs('sum', axis=1, level=1)], axis=1)

在此輸入圖像描述


綜合觀點2

pd.concat([df[('Col1', 'size')].rename(('', 'size')),
           df.xs('sum', axis=1, level=1, drop_level=False)], axis=1)

在此輸入圖像描述

piRSquared打敗了它,但是如果你必須這樣做,並希望保持與列的對齊,並且總和或大小在下面你可以重新索引列以刪除大小值,然后添加一個新列以包含大小值。

例如:

group = df.groupby(['year', 'cntry','state']).agg(['sum','size'])
mi = pd.MultiIndex.from_product([['Col1','Col2','Col3'],['sum']])
group = group.reindex_axis(mi,axis=1)
sizes = df.groupby('state').size().values
group['Tot'] = 0
group.columns = group.columns.set_levels(['sum','size'], level=1)
group.Tot.size = sizes

最終看起來像這樣:

                 Col1 Col2 Col3  Tot
                  sum  sum  sum size
year cntry State
2015 US    CA      20    0    4    1
           FL      40    3    5    1
           MASS     8    1    3    1
           MN      12    2    3    1

暫無
暫無

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

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