我有一个带有各种列的熊猫DF(每个列表示语料库中单词的频率)。每行对应一个文档,每个都是float64类型。
例如:
word1 word2 word3
0.0 0.3 1.0
0.1 0.0 0.5
etc
我想要二进制化而不是频率最终得到一个布尔值(0和1s DF),表示存在一个单词
所以上面的例子将转换为:
word1 word2 word3
0 1 1
1 0 1
etc
我查看了get_dummies(),但输出不是预期的。
答案 0 :(得分:5)
对于任何非零的内容,转换为布尔值将导致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)
输出:
word1 word2 word3
0 0 1 1
1 1 0 1
答案 1 :(得分:1)
我会回答@Alberto Garcia-Raboso的回答,但这是一个非常快速的选择并且利用相同的想法。
使用np.where
pd.DataFrame(np.where(df, 1, 0), df.index, df.columns)
答案 2 :(得分:0)
代码:
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
说明:
答案 3 :(得分:0)
使用Pandas Indexing找到另一种方法。
这可以通过
完成df[df>0] = 1
这很简单!