[英]Converting a pandas dataframe to a list of entries
我有一个来自numpy数组的数据框。
matrix = scipy.sparse.rand(5, 3, density=0.2, format='lil')
array = numpy.array(matrix.toarray())
users = {5: 0, 10: 1, 15: 2, 20: 3, 25: 4}
games = {1: 0, 4: 1, 6: 2}
dataframe = pd.DataFrame(data=array, index=users.keys(), columns=games.keys())
我现在需要的是从该数据框中获取一个列表,其中矩阵中的每个单元格都表示为以下格式的元组:
userID, gameID, value
userID, gameID, value
userID, gameID, value
...
搭配http://surprise.readthedocs.io/en/stable/getting_started.html#load-custom使用
有什么有效的方法吗?
首先使用stack
进行重塑:
...并为3个级别的MultiIndex
添加列并将其转换为tuples
:
L = dataframe.stack().to_frame('a').set_index('a', append=True).index.tolist()
...或带有list comprehension
reset_index
:
L = [tuple(x) for x in dataframe.stack().reset_index().values]
print (L)
[(5, 1, 0.8797632578062221), (5, 4, 0.0),
(5, 6, 0.8996885724198237), (10, 1, 0.0), (10, 4, 0.0),
(10, 6, 0.0), (15, 1, 0.0), (15, 4, 0.07758205674008478),
(15, 6, 0.0), (20, 1, 0.0), (20, 4, 0.0), (20, 6, 0.0),
(25, 1, 0.0), (25, 4, 0.0), (25, 6, 0.0)]
如果只需要非0
值,则只能通过query
过滤:
L = [tuple(x) for x in dataframe.stack().reset_index(name='a').query('a != 0').values]
print (L)
[(5.0, 1.0, 0.87976325780622211),
(5.0, 6.0, 0.8996885724198237),
(15.0, 4.0, 0.077582056740084782)]
l = []
for row in dataframe.itertuples():
for col in dataframe.columns:
l.append((row.Index,col, dataframe.loc[row.Index,col]))
您可以遍历每一行,然后遍历每一列,以将结果元组附加到列表中。 在我的测试中,这比以前的答案要快,这可能取决于您拥有的行数和列数。
%%timeit
l = []
for row in dataframe.itertuples():
for col in dataframe.columns:
l.append((row.Index,col, dataframe.loc[row.Index,col]))
每个回路594 µs±1.5 µs(平均±标准偏差,共运行7次,每个回路1000个)
L = dataframe.stack().to_frame('a').set_index('a', append=True).index.tolist()
L = [tuple(x) for x in dataframe.stack().reset_index().values]
每个循环2.25 ms±12.4 µs(平均±标准偏差,共运行7次,每个循环100个)
根据要求,这里是1000行的计时:
matrix = scipy.sparse.rand(1000, 3, density=0.2, format='lil')
array = numpy.array(matrix.toarray())
index = list(range(1000))
dataframe= pd.DataFrame(data=array, index=index)
%%timeit
l = []
for row in dataframe.itertuples():
for col in dataframe.columns:
l.append((row.Index,col, dataframe.loc[row.Index,col]))
每个循环17 ms±38 µs(平均±标准偏差,共运行7次,每个循环100个)
%%timeit -n 100
L = dataframe.stack().to_frame('a').set_index('a', append=True).index.tolist()
L = [tuple(x) for x in dataframe.stack().reset_index().values]
每个循环5.08 ms±16.5 µs(平均±标准偏差,共运行7次,每个循环100个)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.