#python #pandas #list #dictionary #multi-index
#python #pandas #Список #словарь #многоиндексный
Вопрос:
В столбце фрейма данных у меня есть следующие оценки для каждой строки фрейма данных:
[{'score': 100, 'bonus': 10}, {'score': 60, 'bonus': 0}]
[{'score': 80, 'bonus': 20}, {'score': 90, 'bonus': 30}]
Вывод
Результатом будут два новых столбца для изменения оценки и изменения бонуса для каждой строки. Таким образом, первая строка будет иметь df.delta_score = -40 и df.delta_bonus = -10, а вторая строка будет иметь df.delta_score = 10 и df.delta_bonus = 10.
[{'score': 100, 'bonus': 10}, {'score': 60, 'bonus': 0}, -40, -10]
[{'score': 100, 'bonus': 10}, {'score': 60, 'bonus': 0}, 10, 10]
Я хочу вычислить изменение значения для каждого как для оценки, так и для бонуса для каждого человека (строки) и сгенерировать новый столбец с результирующим значением. Я совершенно сбит с толку этим типом данных, поскольку, похоже, это список словарей, но поскольку каждый словарь имеет одинаковые ключи, я хочу использовать оператор для вычисления разницы. Любая помощь была бы высоко оценена.
Комментарии:
1. как вы узнаете, должна ли разница в бонусе быть
10
или-10
?2. Каким был бы ваш ожидаемый результат, не в словах, но если бы вы действительно могли показать численно, что вы ожидаете?
3. как говорит Дэвид — пожалуйста, укажите ожидаемый результат как часть сообщения.
4. Отредактировано, чтобы включить вывод
Ответ №1:
Мы просто создадим два новых столбца Bonus
и Score
. Вы можете использовать понимание списка с .get()
, чтобы получить значение в соответствии с ключами bonus
и score
. Затем вычтите второе значение из первого значения путем подписки [1]
и вычитания [0]
import pandas as pd
df = pd.DataFrame({'dict_col': [[{'score': 100, 'bonus': 10}, {'score': 60, 'bonus': 0}],
[{'score': 80, 'bonus': 20}, {'score': 90, 'bonus': 30}]]})
df['Bonus'] = df['dict_col'].apply(lambda x: [d.get('bonus') for d in x][1] - [d.get('bonus') for d in x][0])
df['Score'] = df['dict_col'].apply(lambda x: [d.get('score') for d in x][1] - [d.get('score') for d in x][0])
df
Out[1]:
dict_col Bonus Score
0 [{'score': 100, 'bonus': 10}, {'score': 60, 'b... -10 -40
1 [{'score': 80, 'bonus': 20}, {'score': 90, 'bo... 10 10
Ответ №2:
Мы можем сделать explode
тогда мы получим фрейм данных
s = df['Col'].explode()
calcu = pd.DataFrame(s.tolist(), index=s.index)
calcu
Out[170]:
score bonus
0 100 10
0 60 0
1 80 20
1 90 30
После этого вы можете сделать
calcu.groupby(level=0)...(calculation follow by groupby)