2013-07-08 3 views
0

У меня есть 3 разных файла: NewRush4.csv, NewRush5.csv, NewRush6.csv. Я пытаюсь собрать «Всех вождей» из каждого сезона (4, 5 и 6).Чтение и объединение данных из нескольких файлов csv

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

Вот мой код на Python. Я должен прочитать первый файл. Я не уверен, как использовать DictReader.

#!/usr/bin/python 
import csv 
file = open("NewRush4.csv", "rb") 

for line in csv.DictReader(file, delimiter=","): 
    name = line["Player"].strip() 
    yds = line["YDS"].strip() 
    car = line["CAR"].strip() 
    td = line["TD"].strip() 
    fum = line["FUM"].strip() 
    ypc = line["YPC"].strip() 

    print "%-20s%10s%10s%10s%10s%10s" % (name, car, yds, td, fum, ypc) 
file.close() 

Выход:

49erswag      3  14.0   0   0  4.7 
A Beast Playa    7  23.0   0   0  3.3 
A Swanky Guy 2    29  154.0   1   2  5.3 
ACIDRUST      1  4.0   0   0  4.0 
Aj dahitman    227 1898.0  19   2  8.4 
Aldizzl      10  45.0   0   0  4.5 
Areis21      13  58.0   0   2  4.5 
at43      48  214.0   1   1  4.5 
Ayala2012xTCU    57  195.0   0   1  3.4 
B O R Nx 25     13  31.0   0   1  2.4 
B r e e z yx60    4  13.0   0   0  3.3 
Beardown74     116  621.0   6   3  5.4 
beatdown54 2010    26  126.0   3   1  4.8 
behe SWAG     1  -5.0   0   0  -5.0 
Big Murph22     73  480.0   6   2  6.6 
BigBlack973     18  57.0   0   1  3.2 
BiGDaDDyNaPSacK   184 1181.0  20   4  6.4 

Season4 Файл:

Player,YDS,TD,CAR,FUM,YPC 
49erswag, 14.0, 0, 3, 0, 4.7 
A Beast Playa, 23.0, 0, 7, 0, 3.3 
A Swanky Guy 2, 154.0, 1, 29, 2, 5.3 
ACIDRUST, 4.0, 0, 1, 0, 4.0 
Aj dahitman, 1898.0, 19, 227, 2, 8.4 
Aldizzl, 45.0, 0, 10, 0, 4.5 
Areis21, 58.0, 0, 13, 2, 4.5 
at43, 214.0, 1, 48, 1, 4.5 
Ayala2012xTCU, 195.0, 0, 57, 1, 3.4 
B O R Nx 25, 31.0, 0, 13, 1, 2.4 
B r e e z yx60, 13.0, 0, 4, 0, 3.3 
... 

Season5 Файл:

Player,YDS,TD,CAR,FUM,YPC 
a toxic taz, 307.0, 4, 44, 0, 7.0 
AbNL Boss, 509.0, 4, 174, 2, 2.9 
AFFISHAUL, 190.0, 0, 35, 2, 5.4 
AJ DA HITMAN, 1283.0, 19, 228, 6, 5.6 
allen5422, 112.0, 2, 18, 0, 6.2 
Allxdayxapx, 264.0, 1, 76, 2, 3.5 
AlpHaaNike, 51.0, 1, 10, 1, 5.1 
Aura Reflexx, 215.0, 1, 40, 0, 5.4 
AWAKEN DA BEAST, -5.0, 0, 4, 1, -1.3 
AxDub24, -3.0, 0, 2, 1, -1.5 
Ayala2012xTCU, 568.0, 4, 173, 1, 3.3 
BALLxXHAWKXx, 221.0, 1, 47, 2, 4.7 
BANG FIGHTY007, 983.0, 6, 171, 3, 5.7 
bang z ro, 29.0, 0, 9, 0, 3.2 
BEARDOWN74, 567.0, 6, 104, 2, 5.5 
... 

Таким образом, если игрок играл в более чем один сезон, добавить его статистика и печать. В противном случае просто распечатайте.

ответ

0

Использование collections.defaultdict:

Я не знаю, что каждое поле означают; Я суммирую каждое поле. Отрегулируйте ваши потребности.

from collections import defaultdict 
import csv 

class PlayerStat(object): 
    def __init__(self, yds=0, car=0, td=0, fum=0, ypc=0, count=0): 
     self.yds = float(yds) 
     self.car = float(car) 
     self.td = float(td) 
     self.fum = float(fum) 
     self.ypc = float(ypc) 
     self.count = count 
    def __iadd__(self, other): 
     self.yds += other.yds 
     self.car += other.car 
     self.td += other.td 
     self.fum += other.fum 
     self.ypc += other.ypc 
     self.count += other.count 
     return self 

filenames = 'NewRush4.csv', 'NewRush5.csv', 'NewRush6.csv', 
stats = defaultdict(PlayerStat) 
for filename in filenames: 
    with open(filename) as f: 
     reader = csv.DictReader(f, delimiter=',') 
     for row in reader: 
      stat = PlayerStat(row['YDS'], row['CAR'], row['TD'], row['FUM'], row['YPC'], count=1) 
      stats[row['Player']] += stat 

for player in sorted(stats, key=lambda player: stats[player].yds): 
    stat = stats[player] 
    if stat.count == 1: 
     continue 
    print '{0:<20}{1.car:>10}{1.yds:>10}{1.td:>10}{1.fum:>10}{1.ypc:>10}'.format(player, stat) 
+0

Спасибо, я проверил сейчас – user2556506

+0

@ user2556506, Какая ошибка? Можете ли вы показать полную трассировку? – falsetru

+0

Я только что понял, что у одного файла нет заголовков. Но это сработало красиво! Я хочу отсортировать это по YDS сейчас, было бы так же просто, как stats.sort (lambda X: x [2])? – user2556506

0

Вы можете попробовать с python pandas, похоже, что вам нужен инструмент. Для читающей части вы можете пойти с read_csv, а затем создать три DataFrame (или один со всеми записями) и далее манипулировать ими.

Для дубликатов, например, вы можете попробовать duplicatedfunction, идя, например, с df[ df.duplicated('Player') ]. Вы также найдете там множество descriptive statistics функций, таких как max, которые вам, возможно, понадобятся. Взгляни.

Чтобы дать вам вкус (на основе Season4 и данных Season5 в исходном сообщении):

import pandas as pd 

if __name__ == '__main__': 

    # reading in is very convenient here: 
    df_4 = pd.read_csv('season4.csv') 
    df_5 = pd.read_csv('season5.csv') 
    # combine the two DataFrames into one: 
    df = pd.concat([df_4, df_5], ignore_index=True) 
    # see how it looks: 
    print df.head(50) 

      Player YDS TD CAR FUM YPC 
0   49erswag 14 0 3 0 4.7 
1  A Beast Playa 23 0 7 0 3.3 
2 A Swanky Guy 2 154 1 29 2 5.3 
3   ACIDRUST  4 0 1 0 4.0 
4  Aj dahitman 1898 19 227 2 8.4 
5   Aldizzl 45 0 10 0 4.5 
6   Areis21 58 0 13 2 4.5 
7    at43 214 1 48 1 4.5 
8  Ayala2012xTCU 195 0 57 1 3.4 
9  B O R Nx 25 31 0 13 1 2.4 
10 B r e e z yx60 13 0 4 0 3.3 
11  a toxic taz 307 4 44 0 7.0 
12  AbNL Boss 509 4 174 2 2.9 
13  AFFISHAUL 190 0 35 2 5.4 
14  AJ DA HITMAN 1283 19 228 6 5.6 
15  allen5422 112 2 18 0 6.2 
16  Allxdayxapx 264 1 76 2 3.5 
17  AlpHaaNike 51 1 10 1 5.1 
18  Aura Reflexx 215 1 40 0 5.4 
19 AWAKEN DA BEAST -5 0 4 1 -1.3 
20   AxDub24 -3 0 2 1 -1.5 
21 Ayala2012xTCU 568 4 173 1 3.3 
22  BALLxXHAWKXx 221 1 47 2 4.7 
23 BANG FIGHTY007 983 6 171 3 5.7 
24  bang z ro 29 0 9 0 3.2 
25  BEARDOWN74 567 6 104 2 5.5 

    # see for duplicated entries in the 'Player' column: 
    print df[ df.duplicated('Player') ] 

      Player YDS TD CAR FUM YPC 
21 Ayala2012xTCU 568 4 173 1 3.3 

    # see for the maximum value in the 'YDS' column: 
    print 'Max YDS:', df['YDS'].max() 

Max YDS: 1898.0 

Надежда, что помогает.

+0

Благодарим за предложение! – user2556506

+0

@ user2556506 Я написал фрагмент кода, чтобы дать вам лучшее чувство вещей. –

+0

Спасибо! Это имеет смысл! Не знаю, почему я раньше не нашел панд! – user2556506

Смежные вопросы