Объедините csv_rows во вложенном dict с подсчетом - PullRequest
0 голосов
/ 09 июля 2020

Я хочу подсчитать количество любых действий, разделенных на месяц, форму и участников в наборе данных .

Вот мой код

import csv

count_dict = dict()

with open(r'st2.csv',
         mode = 'r') as csv_file:
    
    lines = csv_file.readlines()
    
    for row in lines:
        
        data = row.split(',')
        key = data[1] + '\t' + data[2] + '\t' + data[3][:7] + '\t' + data[4].strip()
        if key in count_dict:
            count_dict[key] += 1
        else:
            count_dict[key] = 1

print('\t'.join(['Name', 'Shape', 'Month', 'Action', 'Count']))

for element, count in count_dict.items():
    items = element.split('\t')
    activities = dict()
    curdict = activities
    
    for chunk in items:
        curdict[chunk] = dict()
        curdict = curdict[chunk]
        
    for i in activities:
        for k in activities[i]:
            for l in activities[i][k]:
                for m in activities[i][k][l]:
                    activities[i][k][l][m] = count
    
    print(activities)

Как В результате я получаю серию словарных статей.

Как я могу посчитать такие значения в одном вложенном диктовке с такой структурой?

{'Googenhaim': {'Circle': {'2020-04': {'pin': 0, 'tap': 0, 'throw': 0, 'play': 1}, '2020-06': {'pin': 0, 'tap': 0, 'throw': 0, 'play': 1}, '2020-05': {'pin': 0, 'tap': 0, 'throw': 0, 'play': 1}}, 'Rectangle': {'2020-04': {'pin': 0, 'tap': 0, 'throw': 0, 'play': 1}, '2020-06': {'pin': 0, 'tap': 0, 'throw': 0, 'play': 1}, '2020-05': {'pin': 0, 'tap': 0, 'throw': 0, 'play': 1}}, 'Trapezoid': {'2020-04': {'pin': 0, 'tap': 0, 'throw': 0, 'play': 1}, '2020-06': {'pin': 0, 'tap': 0, 'throw': 0, 'play': 1}

Ответы [ 2 ]

1 голос
/ 09 июля 2020

Здесь нет необходимости соединять ключи. Если вам нужен вложенный dict, просто создайте его с самого начала:

count_dict = dict()

keys = ['pin', 'play', 'tap', 'throw']

with open('st2.csv') as csv_file:
     rd = csv.reader(csv_file)
     for row in rd:
          if not row[1] in count_dict:
               count_dict[row[1]] = {}
          loc = count_dict[row[1]]
          if not row[2] in loc:
               loc[row[2]] = {}
          dat = loc[row[2]]
          if not row[3] in dat:
               dat[row[3]] = {k: 0 for k in keys}
          typ = dat[row[3]]
          typ[row[4]] += 1
0 голосов
/ 09 июля 2020
import pandas as pd
df = pd.read_csv('data.csv', sep='\t', names=['id','name','shape','date','move'])
df['count'] =df.groupby(['name','shape','date'])['move'].transform('count')
df = df.pivot_table(index=['name','shape','date'],columns='move',values='count', fill_value=0).reset_index()

l = []

for index, r in df.iterrows():
    l.append({r['name']:{r['shape']:{r['date']:{'pin':r['pin'], 'tap':r['tap'], 'throw':r['throw'], 'play':r['play']}}}})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...