[英]Data loading using arrays in Python
在 .txt 文件中有这样格式的数据:
UserId WordID
1 20
1 30
1 40
2 25
2 16
3 56
3 44
3 12
我在寻找什么 - 一些功能可以为每个创建 wordid 列表的 userid 提供结果分组:
[[20, 30, 40], [25, 16], [56, 44, 12]]
我想做的是:
def loadSet(path='/data/file.txt'):
datset={}
for line in open(path+'/file.txt'):
(userid,wordid)=line.split('\t')
dataset.setdefault(user,{})
dataset[userid][wordid]=float(wordid)
return dataset
但我不能处理它。 你能建议这样做的正确方法吗?
我认为您可以将groupby
与apply
tolist
与values
tolist
使用:
print df.groupby('UserId')['WordID'].apply(lambda x: x.tolist()).values
[[20, 30, 40] [25, 16] [56, 44, 12]]
或申请list
,谢谢BM
print df.groupby('UserId')['WordID'].apply(list).values
[[20, 30, 40] [25, 16] [56, 44, 12]]
时间:
df = pd.concat([df]*1000).reset_index(drop=True)
In [358]: %timeit df.groupby('UserId')['WordID'].apply(list).values
1000 loops, best of 3: 1.22 ms per loop
In [359]: %timeit df.groupby('UserId')['WordID'].apply(lambda x: x.tolist()).values
1000 loops, best of 3: 1.23 ms per loop
虽然根据您的目的,您可能对在pandas
中执行此操作更感兴趣,但 numpy 的方法是:
userid,wordid = np.loadtxt('/data/file.txt',skiprows=1,unpack=True)
#example use:
mylist = []
for uid in np.unique(userid):
mylist.append(wordid[userid==uid])
如果您关心性能问题,通常 numpy 会更好:
df=pd.read_csv('file.txt')
def numpyway():
u,v=df.values.T
ind=argsort(u,kind='mergesort') # stable sort to preserve order
return np.split(v[ind],add(1,*where(diff(u[ind]))))
In [12]: %timeit numpyway() # on 8000 lines
10000 loops, best of 3: 250 µs per loop
如果 'UserId' 已经排序,它仍然快三倍。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.