我有一个像
这样的值列表mylist = ["001k","002k"..."400k"]
和pandas df喜欢
id code
1 500k
2 001k
...
100 400k
我想根据code
对mylist
的值进行二值化
因此,第1行在任何地方都收到0,因为"500k"
不在mylist
中
或者,第2行在"001k"
列接收1,在其他地方接收0。
最终的df似乎是
id 001k 002k ... 400k
1 0 0 0
2 1 0 0
...
100 0 0 1
答案 0 :(得分:2)
您可以使用numpy进行批量比较,为您提供布尔值:
>>> import numpy as np
>>> x = np.array(["001k", "002k", "400k"])
>>> y = np.array(["500k", "001k", "400k"])
>>> x[None, :] == y[:, None]
array([[False, False, False],
[ True, False, False],
[False, False, True]], dtype=bool)
从那里,将它转换为整数很简单:
>>> (x[None, :] == y[:, None]).astype(int)
array([[0, 0, 0],
[1, 0, 0],
[0, 0, 1]])
然后,你可以通过取{n}数组的df["code"].values
和np.array(mylist)
轻松地做到这一点。
mylist = ["001k","002k","300k","400k"]
x = np.array(mylist)
df = pd.DataFrame({'code':['500k','600k','001k','002k','001k','400k']})
y = df["code"].values
ndf = pd.DataFrame((x[None, :] == y[:, None]).astype(int),columns=mylist)
输出:
001k 002k 300k 400k 0 0 0 0 0 1 0 0 0 0 2 1 0 0 0 3 0 1 0 0 4 1 0 0 0 5 0 0 0 1
答案 1 :(得分:0)
根据您的修改,您正在寻找dummies:
pd.get_dummies(df["code"])
输出
id 001k 002k ... 400k
1 0 0 0
2 1 0 0
...
100 0 0 1
答案 2 :(得分:0)
或者
df["code"] = df["code"].apply(lambda x: x in mylist)