![](/img/trans.png)
[英]How to mark start/end of a series of non-null and non-0 values in a column of a 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.