Создание колонок по группам
Имеется следующая таблица:
import pandas as pd
data = {'block': ['a', 'a', 'a', 'b', 'b', 'c'],
'SCORE' : [131, 134, 34234, 5675, 67876, 6787]}
data = pd.DataFrame(data)
data
Необходимо создать колонки в зависимости от Block и заполнить их нужными значениями.
data = {'block': ['a', 'a', 'a', 'b', 'b', 'c'],
'a_score' : [131, 134, 34234, 0, 0, 0],
'b_score' : [0, 0, 0, 5675, 67876, 0],
'c_score' : [0, 0, 0, 0, 0, 6787]}
data = pd.DataFrame(data)
data
Следующий код выдает ошибку "The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()."
if data['block'] == 'a':
data = data.assign(a_score = data['SCORE'])
elif data['block'] == 'b':
data = data.assign(b_score = data['SCORE'])
elif data['block'] == 'c':
data = data.assign(c_score = data['SCORE'])
Заранее спасибо!
Ответы (3 шт):
Автор решения: AndreyM
→ Ссылка
Если в лоб, то вот так
data = {'block': ['a', 'a', 'a', 'b', 'b', 'c'],
'score' : [131, 134, 34234, 5675, 67876, 6787]}
data["score_a"] = []
data["score_b"] = []
data["score_c"] = []
for i in range(len(data["block"])):
if data["block"][i] == "a":
data["score_a"].append(data["score"][i])
data["score_b"].append(0)
data["score_c"].append(0)
elif data["block"][i] == "b":
data["score_b"].append(data["score"][i])
data["score_a"].append(0)
data["score_c"].append(0)
else:
data["score_c"].append(data["score"][i])
data["score_a"].append(0)
data["score_b"].append(0)
for k,v in data.items():
print(k,v)
Автор решения: CrazyElf
→ Ссылка
Можно например так. Наверняка можно и без цикла, но я что-то не соображу, это надо к MaxU, уважаемому:
import pandas as pd
data = {'block': ['a', 'a', 'a', 'b', 'b', 'c'],
'score' : [131, 134, 34234, 5675, 67876, 6787]}
data = pd.DataFrame(data)
for i in data.block.unique():
col = 'score_' + i
data[col] = 0
mask = data.block == i
data.loc[mask, col] = data.loc[mask, 'score']
data = data.drop(columns='score')
data
Автор решения: MaxU
→ Ссылка
Можно воспользоваться pd.get_dummies():
res = (data[["block"]]
.join(pd.get_dummies(data["block"])
.mul(data["score"], axis=0)
.add_prefix("score_")))
результат:
In [178]: res
Out[178]:
block score_a score_b score_c
0 a 131 0 0
1 a 134 0 0
2 a 34234 0 0
3 b 0 5675 0
4 b 0 67876 0
5 c 0 0 6787