在Python中对数据帧进行二值化

在Python中对数据帧进行二值化,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个带有不同列的熊猫DF(每个列表示语料库中一个单词的频率)。每一行对应一个文档,每一行的类型都是float64 例如: word1 word2 word3 0.0 0.3 1.0 0.1 0.0 0.5 etc 我想对其进行二值化,而不是以一个布尔值(0s和1s DF)结束频率,该布尔值指示单词的存在 因此,上述示例将转换为: word1 word2 word3 0 1 1 1 0 1 etc 我查看了get_dummies(),但输

我有一个带有不同列的熊猫DF(每个列表示语料库中一个单词的频率)。每一行对应一个文档,每一行的类型都是float64

例如:

word1 word2 word3
0.0   0.3   1.0
0.1   0.0   0.5
etc
我想对其进行二值化,而不是以一个布尔值(0s和1s DF)结束频率,该布尔值指示单词的存在

因此,上述示例将转换为:

word1 word2 word3
0      1     1
1      0     1
etc
我查看了get_dummies(),但输出不是预期的。

代码:

import numpy as np
import pandas as pd

""" create some test-data """
random_data = np.random.random([3, 3])
random_data[0,0] = 0.0
random_data[1,2] = 0.0

df = pd.DataFrame(random_data,
     columns=['A', 'B', 'C'], index=['first', 'second', 'third'])

print(df)

""" binarize """
threshold = lambda x: x > 0
df_ = df.apply(threshold).astype(int)

print(df_)
输出:

A         B         C
first   0.000000  0.610263  0.301024
second  0.728070  0.229802  0.000000
third   0.243811  0.335131  0.863908
A  B  C
first   0  1  1
second  1  1  0
third   1  1  1
   word1  word2  word3
0      0      1      1
1      1      0      1
备注:

  • get_dummies()分析每列的每个唯一值,并引入新列(针对每个唯一值)以标记此值是否处于活动状态
  • =如果列A有20个唯一值,则添加20个新列,其中只有一列为true,其他列为false

强制转换为布尔值将导致任何非零项的
True
,以及任何零项的
False
。如果然后将其转换为整数,则得到1和0

import io
import pandas as pd

data = io.StringIO('''\
word1 word2 word3
0.0   0.3   1.0
0.1   0.0   0.5
''')
df = pd.read_csv(data, delim_whitespace=True)

res = df.astype(bool).astype(int)
print(res)
输出:

A         B         C
first   0.000000  0.610263  0.301024
second  0.728070  0.229802  0.000000
third   0.243811  0.335131  0.863908
A  B  C
first   0  1  1
second  1  1  0
third   1  1  1
   word1  word2  word3
0      0      1      1
1      1      0      1

我的回答应该是@Alberto Garcia Raboso,但这里有一个非常快速的替代方案,它利用了相同的想法

使用
np.where

pd.DataFrame(np.where(df, 1, 0), df.index, df.columns)


时机

找到了另一种使用熊猫索引的方法

这可以简单地通过

df[df>0] = 1
就这么简单