如何根据Python中csv文件中第一列的值分隔行
问题描述:
我有一个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
我不知道如何实现这一点。
任何人都可以帮助我吗?
答
使用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发现在头(可能有多余的空格,大小写等差异)
答
也许这样的事情(假设你的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
答
由于要遍历用户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
使用['csv'(https://docs.python.org/2/library/csv.html)模块 – styvane
不要忘记标记答案是正确的,以便将来阅读此内容的人将知道哪些内容有效! – Scironic