我有数据,多年来,观察结果i被分类为cat。观测值 i 在任何年份都可以属于多个类别,但在各个年份中都是唯一的。我正在尝试按 year、cat、year 和 cat 计算 i 的唯一值。
我正在学习Python (v3.12) 和 Pandas (v2.2.1)。我可以完成这项工作,但只能通过为计数创建单独的表,并将它们与主数据合并回来。请参阅下面的示例。我怀疑有更好的方法来做到这一点。有吗?如果有,怎么办?
import pandas as pd
df = pd.DataFrame(
{'year': [2020,2020,2020,2021,2021,2022,2023,2023,2023,2023],
'cat': [1,1,2,2,3,3,1,2,3,4],
'i': ['a','a','b','c','d','e','f','f','g','g']
})
df
df_cat = df.groupby('cat')['i'].nunique()
df_year = df.groupby('year')['i'].nunique()
df_catyear = df.groupby(['cat', 'year'])['i'].nunique()
df_merged = df.merge(df_cat, how='left', on='cat').rename(columns={'i_x': 'i', 'i_y': 'n_by_cat'})
df_merged = df_merged.merge(df_year, how='left', on='year').rename(columns={'i_x': 'i', 'i_y': 'n_by_year'})
df_merged = df_merged.merge(df_catyear, how='left', on=['cat', 'year']).rename(columns={'i_x': 'i', 'i_y': 'n_by_catyear'})
groupby.transform
:
groups = ['cat', 'year', ['cat', 'year']]
for g in groups:
df[f"n_by_{''.join(g)}"] = df.groupby(g)['i'].transform('nunique')
输出:
year cat i n_by_cat n_by_year n_by_catyear
0 2020 1 a 2 2 1
1 2020 1 a 2 2 1
2 2020 2 b 3 2 1
3 2021 2 c 3 2 1
4 2021 3 d 3 2 1
5 2022 3 e 3 1 1
6 2023 1 f 2 2 1
7 2023 2 f 3 2 1
8 2023 3 g 3 2 1
9 2023 4 g 1 2 1