在Python中对数据帧进行二值化
我有一个带有不同列的熊猫DF(每个列表示语料库中一个单词的频率)。每一行对应一个文档,每一行的类型都是float64 例如:在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(),但输
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
就这么简单