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)
这是一个解决方案:
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)
不过我觉得好像挺乱的。
你可以使用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)