簡體   English   中英

如何在groupby中包含Pandas DataFrame中不存在的列

[英]How to include columns in groupby that is not present in Pandas DataFrame

此數據框分為 A 和 B。

我想根據標准值“0”、“> 0”和 nan 計算值。

請參閱類別 A。沒有“nan”數據。

df :
Category    A      A      A       B       B 
CODE       U-01   U-02   U-03    U-04    U-05
n1          0      1      0       2       nan
n2          1      1      0       nan     nan
n3          3      0      0       0       2

在守則中,

df1 = (df.unstack()
         .mask(lambda x: x.gt(0), '>0')
         .fillna('nan')
         .groupby(level=[0, 2])
         .value_counts()
         .unstack([0,2], fill_value=0)
         .rename(columns={0:'0'}))

輸出丟棄 Category A & nan 列。 我想表達到“0,> 0,nan”中的每一列。

Category           A           B
Standard           0    >0     0    >0     nan 
 n1                2     1     0     1      1
 n2                1     2     0     0      2
 n3                1     1     1     1      0

我想要的輸出表如下所示:

Category                 A                   B
Standard           0    >0    nan      0    >0     nan 
 n1                2     1     0       0     1      1
 n2                1     2     0       0     0      2
 n3                1     1     0       1     1      0

第一個想法是通過DataFrame.reindex創建的所有可能組合使用MultiIndex.from_product

df1 = (df.unstack()
         .mask(lambda x: x.gt(0), '>0')
         .fillna('nan')
         .groupby(level=[0, 2])
         .value_counts()
         .unstack([0,2], fill_value=0)
         .rename(columns={0:'0'})
         )

mux = pd.MultiIndex.from_product([df.columns.levels[0], ['0','>0','nan']])
df1 = df1.reindex(mux, axis=1, fill_value=0)
print (df1)
Category  A         B       
          0 >0 nan  0 >0 nan
n1        2  1   0  0  1   1
n2        1  2   0  0  0   2
n3        2  1   0  1  1   0

或者,您可以通過stackunstack stack來重塑unstack ,並將缺失值轉換為0

df1 = (df.unstack()
         .mask(lambda x: x.gt(0), '>0')
         .fillna('nan')
         .groupby(level=[0, 2])
         .value_counts()
         .unstack([0,2], fill_value=0)
         .rename(columns={0:'0'})
         .stack()
         .fillna(0)
         .astype(int)
         .unstack()
         )


print (df1)
Category  A         B       
          0 >0 nan  0 >0 nan
n1        2  1   0  0  1   1
n2        1  2   0  0  0   2
n3        2  1   0  1  1   0

暫無
暫無

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

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