基于列表

时间:2017-10-05 09:41:27

标签: python pandas binary

我有一个像

这样的值列表
mylist = ["001k","002k"..."400k"]

和pandas df喜欢

id   code
1    500k
2    001k
...
100  400k  

我想根据codemylist的值进行二值化 因此,第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  

3 个答案:

答案 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"].valuesnp.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)