如何将pandas.DataFrame每行元素替换为该值在对应行的出现次数
实现方法
方法1:apply 实现(逻辑直观,适合小数据量)
你之前尝试apply没成功是缺少了map映射计数结果的步骤,正确写法如下:
import pandas as pd # 构造原始DataFrame df = pd.DataFrame({ 'foo': [3,3,1,1,1,2], 'bar': [4,4,1,3,3,3] }).transpose() # 按行遍历,每个元素映射对应行的出现次数 result = df.apply(lambda row: row.map(row.value_counts()), axis=1) print(result)
方法2:向量化实现(性能更高,适合大数据量)
避免行遍历的开销,数据量越大性能优势越明显:
# 先堆叠为Series,按行索引分组统计值计数 df_stack = df.stack() row_value_counts = df_stack.groupby(level=0).value_counts() # 映射计数后恢复原DataFrame结构 result = df_stack.map(row_value_counts).unstack() print(result)
输出结果
两种方法都会得到期望的输出:
0 1 2 3 4 5 foo 2 2 3 3 3 1 bar 2 2 1 3 3 3
内容的提问来源于stack exchange,提问作者Carl C
相关产品推荐
相关产品推荐

