Извлечение элементов из списка словаря в pandas

#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)