Pythonで写真を集計する

photo_name.csvを作成する

A1 A2 A3 A4 A5
1 あいうえお かきくけこ なにぬねの あいうえお かきくけこ
2 かきくけこ たちつてと さしすせそ さしすせそ
3 さしすせそ たちつてと
4 たちつてと なにぬねの
5 なにぬねの

縦の1,2,3,4,5は人数 横のA1,A2,A3,A4,A5は写真の番号

A1の写真を買いたい人の名前を縦に記入 あいうえお かきくけこ さしすせそ たちつてと なにぬねの の5人

A2 かきくけこ たちつてと と順に入力しphoto_name.csvで保存

import csv
from operator import itemgetter
import sqlite3

with open('photo_name.csv', 'r') as fr:

    reader = csv.reader(fr)

    data = []
    header = next(reader)

    for row in reader:

        for i, name in enumerate(row[1:], start=1):

            if name:
                # 番号が数字(通し番号)の場合
                # data.append([name, i, 1])

                # 番号が文字の場合
                data.append([name, header[i], 1])

# ソート(名前・番号順)
data.sort(key=itemgetter(0, 1))

with open('name_data.csv', 'w') as fw:

    writer = csv.writer(fw, lineterminator='\n')
    writer.writerows(data)

# ---------------
# 名前別に写真を集計
# ---------------

conn = sqlite3.connect(':memory:')

c = conn.cursor()

# テーブル作成

# 番号が数字(通し番号)の場合
# c.execute('CREATE TABLE Photo(Name TEXT, Num INTERGER, Count INTERGER)')

# 番号が文字の場合
c.execute('CREATE TABLE Photo(Name TEXT, Num TEXT, Count INTERGER)')

for name, number, count in data:
    c.execute('INSERT INTO Photo VALUES (?,?,?)', (name, number, count))

result = c.execute("SELECT Name, GROUP_CONCAT(Num, ',') FROM Photo GROUP BY Name").fetchall()

nlist = [[name, *number.split(',')] for name, number in result]


with open('name_list.csv', 'w') as fw:

    writer = csv.writer(fw, lineterminator='\n')
    writer.writerows(nlist)

conn.commit()
conn.close()

name_data.csv

Excelのピポットテーブルで集計用

ヘッダー用に一行目に名前・番号・枚数とつけピポットテーブルを作成

行フィールドに名前 列フィールドに番号

データアイテムに枚数を設定すると集計できます。

あいうえお,A1,1
あいうえお,A4,1
かきくけこ,A1,1
かきくけこ,A2,1
かきくけこ,A5,1
さしすせそ,A1,1
さしすせそ,A4,1
さしすせそ,A5,1
たちつてと,A1,1
たちつてと,A2,1
たちつてと,A5,1
なにぬねの,A1,1
なにぬねの,A3,1
なにぬねの,A5,1


name_list.csv

個人別 購入写真番号

あいうえお,A1,A4
かきくけこ,A1,A2,A5
さしすせそ,A1,A4,A5
たちつてと,A1,A2,A5
なにぬねの,A1,A3,A5