计算组中唯一值的数量

问题描述 投票:0回答:1

我有数据,多年来,观察结果i被分类为cat。观测值 i 在任何年份都可以属于多个类别,但在各个年份中都是唯一的。我正在尝试按 yearcatyearcat 计算 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'})
python pandas group-by
1个回答
0
投票

您可以使用一个简单的循环和

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
© www.soinside.com 2019 - 2024. All rights reserved.