4

我有数据框 -

df = pd.DataFrame({'colA':['a', 'a', 'a', 'b' ,'b'], 'colB':['a', 'b', 'a', 'c', 'b'], 'colC':['x', 'x', 'y', 'y', 'y']})

我想编写一个函数来用该列中的频率计数替换每个值。例如 colA 现在将是[3, 3, 3, 2, 2]

我试图通过创建一个包含值和频率计数的字典来做到这一点,将该字典分配给一个变量freq,然后将列值映射到freq. 我写了以下函数

def LabelEncode_method1(col): 
   freq = col.value_counts().to_dict()
   col = col.map(freq)
   return col.head()```

当我运行以下命令 LabelEncode_method1(df.colA)时,我得到了结果3, 3, 3, 2, 2。但是,当我调用 dataframedf时,值colA仍然是'a', 'a', 'a', 'b', 'b'

  1. 我究竟做错了什么。如何修复我的功能?
  2. 如何编写另一个循环遍历所有列并将值映射到freq的函数,而不是为每列调用函数 3 次。
4

2 回答 2

3

你可以做groupby+transform

df['new'] = df.groupby('colA')['colA'].transform('count')
于 2020-07-26T23:11:22.067 回答
3

您可以使用map+ value_counts(您已经找到了,您只需将结果分配回您的 DataFrame)。

df['colA'].map(df['colA'].value_counts())

0    3
1    3
2    3
3    2
4    2
Name: colA, dtype: int64

对于所有列,这将创建一个新的 DataFrame:

pd.concat([
  df[col].map(df[col].value_counts()) for col in df
], axis=1)

   colA  colB  colC
0     3     2     2
1     3     2     2
2     3     2     3
3     2     1     3
4     2     2     3
于 2020-07-26T23:12:25.800 回答