如何在pandas DataFrame中映射值?

4
import numpy as np
import pandas as pd


Y = pd.DataFrame(np.array([1, 3, 4, 0, 1]))

print(Y)

Y[Y[0]] = np.array(0, 0, 0, 0)
Y[Y[1]] = np.array(1, 0, 0, 0)
Y[Y[2]] = np.array(1, 1, 0, 0)
Y[Y[3]] = np.array(1, 1, 1, 0)
Y[Y[4]] = np.array(1, 1, 1, 1)

print(Y)

这是我正在做的事情。我试图得到以下输出:

[[1 0 0 0], [1 1 1 0], [1 1 1 1], [0 0 0 0], [1 0 0 0]]

然而,我却收到了一个错误:
    Y[Y[0]] = np.array(0, 0, 0, 0)
ValueError: only 2 non-keyword arguments accepted

我做错了什么?


你正在给 np.array 传递一个参数列表,即零和一。尝试像你提供给 pd.DataFrame 的那样用括号打包它们。 - Håkon T.
@HåkonT. 你能给我一个例子吗? - Shamoon
当然,我的意思是 np.array(0, 0, 0, 0) 应该改为 np.array([0, 0, 0, 0]) - Håkon T.
2个回答

2
最初的回答
为什么不直接...
yourary=pd.DataFrame([np.ones(x) for x in Y[0]]).fillna(0).values
yourary

Out[63]: 
array([[1., 0., 0., 0.],
       [1., 1., 1., 0.],
       [1., 1., 1., 1.],
       [0., 0., 0., 0.],
       [1., 0., 0., 0.]])

2
我理解你的问题是要将匹配例如0的所有DataFrame行填充为[0, 0, 0, 0],在你的情况下只有一行,但对于1,实际上有两行需要替换。
我已经改用字母而不是数字,以便更容易看到:
"最初的回答"
# Initialize DataFrame with zeros:
Y = pd.DataFrame(np.zeros((5,4), dtype=int), index=list('bdeab'))

现在:

print(Y)

给出:

   0  1  2  3
b  0  0  0  0
d  0  0  0  0
e  0  0  0  0
a  0  0  0  0
b  0  0  0  0

If we now do:

mapping = {
    'a': [0, 0, 0, 0],
    'b': [1, 0, 0, 0],
    'c': [1, 1, 0, 0],
    'd': [1, 1, 1, 0],
    'e': [1, 1, 1, 1]
}

for row in pd.unique(Y.index):
    Y.loc[row, :] = mapping[row]

我们得到了所需的数据框:
   0  1  2  3
b  1  0  0  0
d  1  1  1  0
e  1  1  1  1
a  0  0  0  0
b  1  0  0  0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接