根据不同列中的值替换特定列中的 Pandas 数据框值

bax*_*axx 2 python lookup pandas

给定以下数据框:

x = pd.DataFrame(
    {"a": [1, 2, 3, 2], "b_1": [0, 0, 0, 0], "b_2": [0, 0, 0, 0], "b_3": [0, 0, 0, 0]}
)
Run Code Online (Sandbox Code Playgroud)

看起来像:

   a  b_1  b_2  b_3
0  1    0    0    0
1  2    0    0    0
2  3    0    0    0
3  2    0    0    0

Run Code Online (Sandbox Code Playgroud)

如何将其转换为:

   a  b_1  b_2  b_3
0  1    0    0    0
1  2    0    0    0
2  3    0    0    0
3  2    0    0    0

Run Code Online (Sandbox Code Playgroud)

看起来像:

   a  b_1  b_2  b_3
0  1   -1    0    0
1  2    0   -1    0
2  3    0    0   -1
3  2    0   -1    0

Run Code Online (Sandbox Code Playgroud)

编辑 2

这是一个解决方案:

y = pd.DataFrame(
    {
        "a": [1, 2, 3, 2],
        "b_1": [-1, 0, 0, 0],
        "b_2": [0, -1, 0, -1],
        "b_3": [0, 0, -1, 0],
    }
)
Run Code Online (Sandbox Code Playgroud)

不过我觉得好像挺乱的。

Ben*_*n.T 5

你可以使用pd.get_dummies.

print(pd.get_dummies(x['a']).add_prefix('b_'))
   b_1  b_2  b_3
0    1    0    0
1    0    1    0
2    0    0    1
3    0    1    0
Run Code Online (Sandbox Code Playgroud)

然后你有不同的选择来减去它x。例如,您可以将这种方式与reindex.

y = x - pd.get_dummies(x['a']).add_prefix('b_').reindex(columns=x.columns, fill_value=0)
print(y)
   a  b_1  b_2  b_3
0  1   -1    0    0
1  2    0   -1    0
2  3    0    0   -1
3  2    0   -1    0
Run Code Online (Sandbox Code Playgroud)

请注意,如果您还没有列b_*已经在x和希望自动从列中生成它们,那么像这样的工作了。

x = pd.DataFrame({"a": [1, 2, 3, 2]})
y = x.sub(pd.get_dummies(x['a']).add_prefix('b_'), fill_value=0)
print(y)
Run Code Online (Sandbox Code Playgroud)