将DataFrame转换为列表的列表,且不改变值的数据类型。

8

df.values.to_list()list(df.values) 将数据框转换为列表,但整数值会被转换为浮点值。

DataFrame 是一个,

   HSCode  value  year
0       2   0.18  2018
1       3   0.00  2018
2       4  12.48  2018
3       6   0.00  2018
4       7   1.89  2018

需要输出的内容是:
[[2,0.18,2018],[3,0.00,2018]..]

但是,df.values.tolist() 返回的结果是:

[[2.0,0.18,2018.0],...]
2个回答

6

itertuples

list(map(list, df.itertuples(index=False)))

[[2, 0.18, 2018],
 [3, 0.0, 2018],
 [4, 12.48, 2018],
 [6, 0.0, 2018],
 [7, 1.89, 2018]]

简单明了一些

而且更不易读

[*map(list, zip(*map(df.get, df)))]

[[2, 0.18, 2018],
 [3, 0.0, 2018],
 [4, 12.48, 2018],
 [6, 0.0, 2018],
 [7, 1.89, 2018]]

4

您可以使用中介的numpy记录数组来保留数据类型,然后如果必要,再转换为列表。

这种方法速度相当快,但会使您得到一个元组列表,而不是一个列表列表。


df.to_records(index=False).tolist()

[(2, 0.18, 2018),
 (3, 0.0, 2018),
 (4, 12.48, 2018),
 (6, 0.0, 2018),
 (7, 1.89, 2018)]

1
这可能仍然更快 [*zip(*map(df.get, df))] - piRSquared
同意,除非列数相当高,否则“to_records”不会提供性能增益。 - user3483203
不是的。在更长的数据框上,速度大约快了2倍。在更宽的数据上...仍然更快。 - piRSquared
因此,我可能会更经常使用to_records - piRSquared
我发现 df.get 在大约1000x1000的情况下表现更好,然后似乎会有所改变。对于浮点数,df.get 的表现要更好一些,可以持续到大约3000。无论哪种情况,tolist 占据了大部分时间。 - user3483203
1
当我有动力时,我会进一步调查。 - piRSquared

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接