获取唯一百分比而不是从列中计数
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
我有一个数据框,其中一列包含重复值,另一列包含针对它们的类别。
示例数据框:
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