繁体   English   中英

在 Python 中使用数组加载数据

[英]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

但我不能处理它。 你能建议这样做的正确方法吗?

我认为您可以将groupbyapply tolistvalues 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM