簡體   English   中英

Pandas DataFrame中的交叉表

[英]crosstab in Pandas DataFrame

我創建了一個DataFrame

    A1  A2  A3  A4
0   cccc    xx  6   5
1   aaaa    yy  8   0
2   aaaa    xx  15  0
3   bbbb    xx  21  4
4   bbbb    xx  26  0
5   cccc    yy  33  2
6   aaaa    xx  44  1
7   cccc    xx  48  2
8   aaaa    yy  58  0
9   cccc    yy  59  5
10  bbbb    yy  77  0
11  bbbb    yy  99  0

現在使用crosstab()和下面給出的命令創建了新的DataFrame。

df5 = pd.crosstab(df4['A1'], df4['A2'], margins=False,values=df4['A3'] , 
                 dropna=False, aggfunc='mean').reset_index().fillna(0)

這工作正常。 它給我的輸出如下

A2   A1      xx      yy
0   aaaa    29.5    33.0
1   bbbb    23.5    88.0
2   cccc    27.0    46.0

現在我要將平均值存儲到DataFrame df4

由於我想基於crosstab()更改df5中包含0的A3 ,該怎么辦? 我想要輸出如下

    A1      A2  A3  A4    
0   aaaa    xx  15  29.5    
1   aaaa    xx  44  1.0    
2   aaaa    yy  8   33.0    
3   aaaa    yy  58  33.0    
4   bbbb    xx  21  4.0    
5   bbbb    xx  26  23.5    
6   bbbb    yy  77  88.0    
7   bbbb    yy  99  88.0    
8   cccc    xx  6   5.0    
9   cccc    xx  48  2.0

mask + groupby + transform

忽略不必要的重新排序和刪除所需輸出中的某些行,可以將maskgroupby一起使用:

group_mean = df4.groupby(['A1', 'A2'])['A3'].transform('mean')

df4['A4'] = df4['A4'].mask(df4['A4'] == 0, group_mean)

print(df4)

      A1  A2  A3    A4
0   cccc  xx   6   5.0
1   aaaa  yy   8  33.0
2   aaaa  xx  15  29.5
3   bbbb  xx  21   4.0
4   bbbb  xx  26  23.5
5   cccc  yy  33   2.0
6   aaaa  xx  44   1.0
7   cccc  xx  48   2.0
8   aaaa  yy  58  33.0
9   cccc  yy  59   5.0
10  bbbb  yy  77  88.0
11  bbbb  yy  99  88.0

暫無
暫無

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

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