2015-04-29 3 views
0

Используя формат следующего файла CSV:Counting первое появление поля в CSV файл

Pos ID Name 
1 0001L01 50293 
2 0002L01 128864 
3 0003L01 172937 
4 0004L01 12878 
5 0005L01 demo 
6 0004L01 12878 
7 0004L01 12878 
8 0005L01 demo 

Я хочу включить в словарь: [ID], {Pos, Name, FirstTime}, где FirstTime соответствует положению, что ID первым появляется в файл CSV. Например ID = 0005L01 бы: [0005L01],{5,demo,5},{8,demo,5}

мне удалось сохранить [ID], {Pos,Name}, но я борюсь с FirstTime. До сих пор я получил:

# From the csv reader, save it to a list 
dlist=[] 
for row in reader: 
     # store only the non empty lines 
     if any(row): 
     dlist.append(row) 
d={} 
for row in dlist: 
    d.setdefault(row[1],[]).append([row[0],row[2]]) 
+0

Что такое 'FirstTime' – thefourtheye

+0

@thefourtheye' FirstTime' - это позиция, в которой сначала появляется идентификатор в файле CSV. – Manolete

+0

Вы действительно хотите, чтобы '{Pos, Name, FirstTime}' был набором, а не чем-то упорядоченным, как кортеж? – abarnert

ответ

1

это проще, если вычислить firstTime первый, а затем заполнить свой словарь:

# From the csv reader, save it to a list 
dlist=[] 
for row in reader: 
    # store only the non empty lines 
    if any(row): 
     dlist.append(row) 
firstTime={} 
for row in dlist: 
    if row[1] not in firstTime: firstTime[row[1]] = row[0] 
d={} 
for row in dlist: 
    d.setdefault(row[1],[]).append([row[0],row[2],firstTime[row[1]]]) 
+0

@ mescalinum: Почти получилось, просто замените 'if row [0] не в firstTime: firstTime [row [1]] = row [0]' by 'if row [1] not in firstTime: firstTime [row [1] ] = row [0] ' – Manolete

+0

OH! правильно! извините, я думал, что это решение было достаточно простым, что я не тестировал его :-) [Я только что исправил свой ответ] – fferri

1

Если вы хорошо использовать панд, попробуйте следующее:

In [269]: temp 
Out[269]: 
    Pos  ID Name 
0 1 0001L01 50293 
1 2 0002L01 128864 
2 3 0003L01 172937 
3 4 0004L01 12878 
4 5 0005L01 demo 
5 6 0004L01 12878 
6 7 0004L01 12878 
7 8 0005L01 demo 

Далее группа по ID и применять min:

In [271]: temp.groupby('ID').min().rename(columns={'Pos':'Firsttime'}) 
Out[271]: 
     Firsttime Name 
ID       
0001L01   1 50293 
0002L01   2 128864 
0003L01   3 172937 
0004L01   4 12878 
0005L01   5 demo 

In [272]: y = temp.groupby('ID').min().rename(columns={'Pos':'Firsttime'}) 

Теперь, слияние с исходным фреймворком данных:

In [276]: temp.merge(y) 
Out[276]: 
    Pos  ID Name Firsttime 
0 1 0001L01 50293   1 
1 2 0002L01 128864   2 
2 3 0003L01 172937   3 
3 4 0004L01 12878   4 
4 6 0004L01 12878   4 
5 7 0004L01 12878   4 
6 5 0005L01 demo   5 
7 8 0005L01 demo   5 

Теперь, итерацию и сохранить его в словарь:

In [280]: temp.merge(y).iterrows().next() 
Out[280]: 
(0, Pos    1 
ID   0001L01 
Name   50293 
Firsttime   1 
Name: 0, dtype: object) 
1
from collections import defaultdict 

d = defaultdict(list) 
first = {} 

for row in reader: 
    if any(row): 
     pos, ID, name = row 
     if ID not in first: 
      first[ID] = pos 
     d[ID].append(pos, name, first[ID]) 
Смежные вопросы