繁体   English   中英

将熊猫数据框转换为条目列表

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

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