我正试图找到一种简单的方法,将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_counts
与apply
:一起使用
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.melt
和pd.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
,该索引将对应于我分配给j
的df
中的值。我将使用这些索引在由i
和j
中的索引指定的数组a
的位置加一