簡體   English   中英

如何使用分組計算 pandas dataframe 中的唯一非空值?

[英]How to count unique non-null values in pandas dataframe using group by?

我在試圖解決這個問題時遇到了麻煩,非常感謝一些幫助。 So, I have a dataframe with year, state code, var1 and var2 (which contain null and non null values). 我想創建一個新的 dataframe 來計算具有至少 1 個非 null 值的唯一狀態數以及按年份分組的非 null 值的總數。

我目前的 df 是什么樣的:

    year    state   var1    var2    
0   2018    1       NaN     2    
1   2018    2       1       1    
2   2018    3       NaN     NaN  
3   2018    4       1       2    
4   2018    5       NaN     1   
6   2019    1       NaN     NaN  
7   2019    2       1       1    
8   2019    3       NaN     NaN  
9   2019    4       2       1    
10  2019    5       2       NaN 

我希望新的 df 看起來像什么。 我希望原始 df 轉置,以便年份是列值,而具有條件的變量是我的行。

                                                  2018    2019
var1
      Number of states with at least 1 non-null:  2       3
      Number of respondents with non-null var:    2       3
      Average                                     1       1
var2
      Number of states with at least 1 non-null:  2       2
      Number of respondents with non-null var:    4       2
      Average                                     2       1

希望這是有道理的。 感謝您的關注!

示例中的數據似乎存在問題:如前所述,每個(state, year)數據只有一行,這違背了在“至少有 1 個非 null 值的州”和“非空值的總數”。

我能想到的一種產生預期結果的方法是,如果樣本數據是:

nan = float('nan')
df = pd.DataFrame({
    'year': [2018, 2018, 2018, 2018, 2018, 2019, 2019, 2019, 2019, 2019],
    'state': [1, 2, 3, 1, 2, 1, 2, 3, 4, 5],
    #                  ^  ^ changed from OP's data
    'var1': [nan, 1.0, nan, 1.0, nan, nan, 1.0, nan, 2.0, 2.0],
    'var2': [2.0, 1.0, nan, 2.0, 1.0, nan, 1.0, nan, 1.0, nan],
})

在這種情況下,我們可以通過以下方式獲得預期的結果:

c = df.groupby(['year', 'state']).count()
res = (
    pd.concat([c/c, c], keys=['uniq', 'cnt'], axis=1)
    .groupby('year').sum(0).astype(int).T
    .swaplevel().sort_index(ascending=[True, False])
)
>>> res
year       2018  2019
var1 uniq     2     3
     cnt      2     3
var2 uniq     2     2
     cnt      4     2

或者(並且少一點hacky):

import numpy as np

c = df.groupby(['year', 'state']).count()
res = c.groupby('year').agg([np.count_nonzero, sum]).T
res.index = res.index.set_levels(['uniq', 'cnt'], level=1)

暫無
暫無

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

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