2015-05-29 30 views
0

我有一個csv文件。第一列是user_id。如何根據Python中csv文件中第一列的值分隔行

例如:

User_ID Latitude Longitude 
1 55.75672775 37.61538506 
1 55.75286376 37.62190819 
1 47.60760975 -122.334137 
1 40.74881754 -73.99116039 
2 40.72046126 -74.00974274 
2 41.56305944 -70.65380573 
2 41.56302733 -70.65389156 
2 41.5542606 -70.60093403 
2 44.55035619 -69.63040352 

我要運行一些功能,爲每一個獨特的用戶。說,記錄用戶擁有的所有位置。 所以我想要做的事,如:

For each user_id: 
    For row in all the rows of this user: 
     Do something 
     print user_id, result_output    

我不知道如何實現這一點。

任何人都可以幫助我嗎?

+0

使用['csv'(https://docs.python.org/2/library/csv.html)模塊 – styvane

+0

不要忘記標記答案是正確的,以便將來閱讀此內容的人將知道哪些內容有效! – Scironic

回答

1

使用CSV模塊的結果合併在DictReader,然後播放:

import csv 

data = {} 

with open('filepath', 'r') as input: 
    reader = csv.DictReader(input) 

    for row in reader: 
     try: 
      data[row['user_id']].append((row['Latitude'], row['Longitude'])) 
     Except KeyError: 
      data[row['User_ID'] = [(row['Latitude'], row['Longitude'])] 

for user_id in data: 
    # do stuff with your tuples of longs and lats for each user_id 

DictReader需要你的第一行,並將其作爲每列的密鑰。

使用這個,我們可以用你的用戶id和一個列表作爲一個值來創建一個字典。從那裏你每次遇到user_id時,你只需要在用戶列表中追加一個長整數和一列的元組。

如果您的分隔符不是逗號,請將delimter參數添加到DictReader。例如:

reader = DictReader(file, delimiter='\t') 

並確保您使用的密鑰是什麼的Python發現在頭(可能有多餘的空格,大小寫等差異)

0

也許這樣的事情(假設你的CSV是製表符分隔)

import csv 
import itertools 

with open('users.csv') as f: 
    reader = csv.DictReader(f, delimiter='\t') 

    userdict = {} 
    for line in reader: 
     uid = int(line['User_ID']) 
     if uid not in userdict: 
      userdict[uid] = [] 
     userdict[uid].append({k: float(v) for k,v in line.iteritems() if k != 'User_ID'}) 

    for k, v in userdict.iteritems(): 
     print 'User %d has been to' % k 
     for loc in v: 
      print 'lat=%f long=%f' % (loc['Latitude'], loc['Longitude']) 

第一部分產生由所述用戶ID(轉換爲int鍵控dict),值是所有用於該用戶(轉換爲浮點數)的緯度/經度對的列表。

的字典看起來像

{1: [{'Latitude': 55.75672775, 'Longitude': 37.61538506}, {'Latitude': 55.75286376, 'Longitude': 37.62190819}, {'Latitude': 47.60760975, 'Longitude': -122.334137}, {'Latitude': 40.74881754, 'Longitude': -73.99116039}], 2: [{'Latitude': 40.72046126, 'Longitude': -74.00974274}, {'Latitude': 41.56305944, 'Longitude': -70.65380573}, {'Latitude': 41.56302733, 'Longitude': -70.65389156}, {'Latitude': 41.5542606, 'Longitude': -70.60093403}, {'Latitude': 44.55035619, 'Longitude': -69.63040352}]} 

其使用所創建的字典,打印所有每個用戶已經向座標的第二部分。所以,你得到的輸出喜歡

User 1 has been to 
lat=55.756728 long=37.615385 
lat=55.752864 long=37.621908 
lat=47.607610 long=-122.334137 
lat=40.748818 long=-73.991160 
User 2 has been to 
lat=40.720461 long=-74.009743 
lat=41.563059 long=-70.653806 
lat=41.563027 long=-70.653892 
lat=41.554261 long=-70.600934 
lat=44.550356 long=-69.630404 

你可以使用的字典由具有由元組所代表的緯度,經度對可能保存。

元組版(帶defaultdict開機!)

import csv 
import itertools 
import collections 

with open('users.csv') as f: 
    reader = csv.DictReader(f, delimiter='\t') 

    userdict = collections.defaultdict(list) 
    for line in reader: 
     userdict[int(line['User_ID'])].append((float(line['Latitude']), float(line['Longitude']))) 

    for k, v in userdict.iteritems(): 
     print 'User %d has been to' % k 
     for loc in v: 
      print 'Lat=%f Long=%f' % loc 
0

由於要遍歷用戶ID,您將需要知道他們是提前—什麼,這將需要閱讀整個提前一次提交文件:

要查找特定用戶標識的所有行,您需要再次讀取整個文件以將其全部取出。這也意味着你需要多次這樣做,每個唯一的用戶ID一次。確保文件已打開並在每次迭代中正確關閉文件。下面的with聲明確保發生這種情況。

在這裏你去(假設你的csv文件是製表符分隔):

import csv 
from collections import defaultdict 

filename = 'user_data.csv' 

with open(filename, 'rb') as user_data: 
    reader = csv.reader(user_data, delimiter='\t') 
    next(reader) # skip header 
    user_ids = set(row[0] for row in reader) 

for user_id in sorted(user_ids): 
    with open(filename, 'rb') as user_data: 
     reader = csv.reader(user_data, delimiter='\t') 
     next(reader) # skip header 
     for row in (row for row in reader if row[0] == user_id): 
      pass # do something 
相關問題