#python-3.x #pandas-groupby
#python-3.x #pandas-groupby
Вопрос:
Я копался в переполнении стека, пытаясь решить проблему, я каждый раз приближаюсь, но я не получаю именно то, что мне нужно. (это общий csv-файл, который я составил для примера) something.csv
lastName, firstName, address, tool, description
Franks, James, 321 Hammond, hammer, "It hammers"
Franks, James, 321 Hammond, nails, "It Nails stuff"
Phiilips, Tom, 773 James St, mower, "It mows"
Phiilips, Tom, 773 James St, weed-wacker, "It whacks"}
Я пытаюсь объединить строки в словарь, где они читают что-то вроде этого
Franks: [(hammer, "It hammers"), (nails, "It Nails stuff")]
Phiilips: [(mower, "It mows"), (weed-wacker, "It whacks")]
Мне интересно, возможно ли это вообще, или я просто усложняю ситуацию…
Это то, что я пробовал до сих пор
df3 = pd.read_csv("results.csv", encoding="utf-8", skipinitialspace=True)
df3.groupby("lastname")[["tool","description"]].apply(lambda g: list(map(tuple, g.values.tolist()))).to_dict()
Результаты:
{Franks: [("hammer", "It hammers"), ("nails", "It Nails stuff")]}
{Franks: [("hammer", "It hammers"), ("nails", "It Nails stuff")]}
{Phiilips:[("mower", "It mows"), ("weed-wacker", "It whacks")]}
{Phiilips:[("mower", "It mows"), ("weed-wacker", "It whacks")]}
Пока недостаточно хорошо, чтобы понять, почему я получаю повторяющиеся строки, но
что-то вроде этого без повторяющихся строк — это то, к чему я стремлюсь
.
Ответ №1:
Вы можете использовать csv
модуль и его DictReader
.
import csv
from collections import defaultdict
dd = defaultdict(list)
with open('results.csv', 'r') as fin:
reader = csv.DictReader(fin)
for row in reader:
dd[row['lastName']].append((row['tool'], row['description']))
Вывод:
defaultdict(list,
{'Franks': [('hammer', 'It hammers'), ('nails', 'It Nails stuff')],
'Phiilips': [('mower', 'It mows'), ('weed-wacker', 'It whacks')]})
Комментарии:
1. Я получаю тот же результат, что и результат, который я опубликовал выше: defaultdict(<class ‘list’>, {‘Franks’: [(‘hammer’, ‘It hammers’), (‘nails’, ‘It Nails stuff’)]) defaultdict(<class ‘list’>, {‘Franks’: [(‘hammer’, ‘It hammers’), (‘nails’, ‘It Nails stuff’)]) defaultdict(<class ‘list’>, {‘Phiilips’: [(‘косилка’, ‘Она косит’), (‘сорняк-wacker’, ‘It whacks’)]) defaultdict(<class ‘list’>, {‘Phiilips’: [(‘косилка’, ‘Она косит’), (‘сорняк-wacker’, ‘Он бьет’)]) . Как мне просто получить один результат для каждой строки?
2. @VanPatton Но это не тот же результат???
dd['Franks']
возвращает[('hammer', 'It hammers'), ('nails', 'It Nails stuff')]
, как и следовало ожидать, и то же самое дляdd['Phiilips']
3. После просмотра остальной части вашего комментария я бы предположил, что у вас есть дополнительный
for
цикл где-то еще в вашем коде.4. Рад, что смог помочь!