需要帮助获取熊猫数据帧中每个数字的频率



我正试图找到一种简单的方法,将panda数据帧转换为另一个具有每个功能频率的数据帧。我将在下面提供一个我尝试做什么的例子

当前数据帧示例(这里的特征标签只是索引值(:

0   1   2   3   4   ...   n
0  2   3   1   4   2         ~
1  4   3   4   3   2         ~
2  2   3   2   3   2         ~
3  1   3   0   3   2         ~
...
m  ~   ~   ~   ~   ~         ~

数据帧我想将其转换为:

0   1   2   3   4   ...   n
0  0   1   2   1   1         ~
1  0   0   1   2   2         ~
2  0   0   3   2   0         ~
3  1   1   1   2   0         ~
...
m  ~   ~   ~   ~   ~         ~

正如您所看到的,列标签对应于数据帧中可能的数字,并且每行该数字的每个频率都被放入相关行的特定功能中。有没有一种简单的方法可以用python实现这一点?我有一个大的数据帧,我正试图将其转换为频率的数据帧以进行特征选择。

如果需要更多信息,我会更新我的帖子。

pd.value_countsapply:一起使用

df.apply(pd.value_counts, axis=1).fillna(0)
0    1    2    3    4
0  0.0  1.0  2.0  1.0  1.0
1  0.0  0.0  1.0  2.0  2.0
2  0.0  0.0  3.0  2.0  0.0
3  1.0  1.0  1.0  2.0  0.0

可选DataFrame.meltpd.crosstab

df2 = df.T.melt()
pd.crosstab(df2['variable'], df2['value'])

Numpy

这个值就是速度。但显然更为复杂。

n, k = df.shape
i = df.index.to_numpy().repeat(k)
j = np.ravel(df)
m = j.max() + 1
a = np.zeros((n, m), int)
np.add.at(a, (i, j), 1)
pd.DataFrame(a, df.index, range(m))
0  1  2  3  4
0  0  1  2  1  1
1  0  0  1  2  2
2  0  0  3  2  0
3  1  1  1  2  0

这将产生一个索引i,该索引将对应于我分配给jdf中的值。我将使用这些索引在由ij中的索引指定的数组a的位置加一

最新更新