获取唯一百分比而不是从列中计数

Getting nunique percentage instead of count from a column

我有一个数据框,其中一列包含重复值,另一列包含针对它们的类​​别。

示例数据框:

df  = pd.DataFrame({'col1': [101,102,103,101,104,106,102,103,104,105,106],
                    'col2': ['A','B','A','A','A','B','B','A','A','B','B'],
                    'col3': [123,234,345,456,567,678,789,890,912,123,234],
                   })

我需要的是从 col2 中获取具有唯一值的 table 作为索引或列,并在第二列中获取 col1 中该类别下唯一值的计数。

上述示例的预期结果:

A    0.5
B    0.5

我可以使用它获得 col2 下的唯一值计数。但是,我需要百分比格式的。

df.groupby(['col2'])['col1'].nunique()

我可以通过在这行代码中向 .apply() 添加一个函数或通过其他方法或函数来实现吗?

我不想为此 nunique() 创建一个新变量 series/dataframe 然后通过另一行代码使用操作为百分比创建一个新列。有什么方法可以在上面的代码行中做到这一点?

这是我的尝试,希望我答对了你的问题:

import pandas as pd
from collections import Counter

df  = pd.DataFrame({'col1': [101,102,103,101,104,106,102,103,104,105,106],
                    'col2': ['A','B','A','A','A','B','B','A','A','B','B'],
                    'col3': [123,234,345,456,567,678,789,890,912,123,234],
                   })
grouped_list: pd.Series = df.groupby(['col2'])['col1'].apply(list)
unique_cnt = grouped_list.apply(lambda content: {key: value / len(content) for key, value in Counter(content).items()})
unique_cnt_df = unique_cnt.apply(pd.Series)

如果您要处理许多单元,它可能不是最有效的资源,但可以以优雅的方式完成工作。根据哪种格式更适合您,您可以使用 unique_cnt 变量 pd.Series 或 unique_cnt_df pd.DataFrame 其中 A、B、 ... 是索引和 101、102... 作为列(一些单元格是 NaN,因为不存在相应的记录)。

# unique_cnt
col2
A    {101: 0.333, 103: 0.333, 104: 0.333}
B    {102: 0.4,   106: 0.4,   105: 0.2}

# unique_cnt_df
           101  102       103       104  105  106
col2                                             
A     0.333333  NaN  0.333333  0.333333  NaN  NaN
B          NaN  0.4       NaN       NaN  0.2  0.4

我可以通过一条语句找到一种方法:

(df.groupby(['col2'])['col1'].nunique() / df.groupby(['col2'])['col1'].nunique().sum())

这将 return 唯一值百分比的预期输出而不是数字(计数),如下所示:

A    0.5
B    0.5