如何在不使用循环、apply或agg的情况下统计DataFrame列唯一值并转字典
问题
给定如下数据代码:
data = {'Col1': [1, 2, 2, 3, 1], 'Col2': ['A', 'B', 'B', 'A', 'C']} df = pd.DataFrame(data)
希望得到如下格式的字典:
{'Col1': {1:2, 2:2, 3:1}, 'Col2': {'A':2, 'B':2, 'C':1} }
要求:不得使用任何loop、apply或agg方法。
尝试了以下代码,但因unstack操作插入NaN值填充空缺,无法得到目标结果:
count_matrix = df.stack().groupby(level=1).value_counts() count_matrix = count_matrix.unstack(0) count_matrix = count_matrix.to_dict()
解决方案
可以通过pd.crosstab构建交叉表,替换无效值后转换为目标字典,全程无需使用禁用方法:
import pandas as pd import numpy as np data = {'Col1': [1, 2, 2, 3, 1], 'Col2': ['A', 'B', 'B', 'A', 'C']} df = pd.DataFrame(data) # 构建交叉表,统计每列各值的出现次数 cross_tab = pd.crosstab(df.stack().index.get_level_values(1), df.stack().values) # 将0值替换为NaN,删除无意义的空列,转换为整数后生成目标字典 result = cross_tab.replace(0, np.nan).dropna(axis=1).astype(int).to_dict('index') print(result)
执行后输出:
{'Col1': {1: 2, 2: 2, 3: 1}, 'Col2': {'A': 2, 'B': 2, 'C': 1}}
内容的提问来源于stack exchange,提问作者jkkl bbnn
相关产品推荐
相关产品推荐

