我正在使用像这样的数据集进行一些练习:
列出了许多词典
users = [
{"id": 0, "name": "Ashley"},
{"id": 1, "name": "Ben"},
{"id": 2, "name": "Conrad"},
{"id": 3, "name": "Doug"},
{"id": 4, "name": "Evin"},
{"id": 5, "name": "Florian"},
{"id": 6, "name": "Gerald"}
]
包含少量列表的词典
users2 = {
"id": [0, 1, 2, 3, 4, 5, 6],
"name": ["Ashley", "Ben", "Conrad", "Doug","Evin", "Florian", "Gerald"]
}
Pandas数据框
import pandas as pd
pd_users = pd.DataFrame(users)
pd_users2 = pd.DataFrame(users2)
print pd_users == pd_users2
问题:
答案 0 :(得分:26)
这与column oriented databases与面向行有关。您的第一个示例是面向行的数据结构,第二个示例是面向列的。在Python的特定情况下,使用slots可以使第一个更高效,这样就不需要为每一行复制列的字典。
哪种形式更好地取决于您对数据的处理方式;例如,如果您只访问所有行,则面向行是自然的。同时以列为导向可以更好地利用缓存,例如当您在特定字段中搜索时(在Python中,这可能会因为大量使用引用而减少;类似array的类型可以优化)。传统的面向行的数据库经常使用面向列的排序索引来加速查找,并且了解这些技术后,您可以使用键值存储实现任何组合。
Pandas确实将您的示例转换为相同的格式,但转换本身对于面向行的结构来说更昂贵,因为必须读取每个单独的字典。所有这些成本可能都很小。
在您的示例中有第三个选项不明显:在这种情况下,您只有两列,其中一列是从0开始的连续范围内的整数ID。这可以按条目本身的顺序存储,这意味着您可以在名为users2['name']
的列表中找到整个结构;但值得注意的是,没有他们的位置,条目是不完整的。该列表使用enumerate()转换为行。数据库通常也有这种特殊情况(例如,sqlite rowid)。
通常,从保持代码合理的数据结构开始,只有在了解用例并且存在可衡量的性能问题时才进行优化。像熊猫这样的工具可能意味着大多数项目都能正常运行而不需要微调。
答案 1 :(得分:6)
用户
当您需要添加一些新用户时,只需填写所有用户详细信息的新dict
并附加
可以像@StevenRumbalski建议的那样轻松排序
搜索很容易
随着记录的增长,这更加紧凑,易于管理(对于一些非常多的记录,我认为我们需要的东西也比用户更好)
<强> Users2 强>
PS:但我想了解users2
优于users
的优势
再一个不错的问题
答案 2 :(得分:5)
查找时间复杂度 -
但如果您的数据不是那么大而且现代的处理器非常有效,那么这并不会造成太大的伤害。
您应该选择查找语法清晰易读的内容(可读性很重要)
第一个选项非常合适,因为变量是用户的集合(已经分配了id),而第二个选项只是用户名和ID的集合。
答案 3 :(得分:4)
users
实际上是user
元素的集合。因此,将user
元素定义为独立实体会更好。所以你的第一个选择是正确的。
答案 4 :(得分:4)
关于熊猫方面的一些答案:
pd_users.T
进行转置,然后会看到(通过info()
或dtypes
)然后将所有内容存储为通用对象,因为该列包含字符串和数字。pd_users.set_index('id')
,以便您的数据框本质上是以id
为键的字典。反之亦然name
。Series
而不是DataFrame
。系列本质上是数据帧的一列,虽然它实际上只是一个带索引的一维数据数组(&#34;键&#34;)。快速演示(使用df
作为数据框名称,通用约定):
>>> df.set_index('name')
id
name
Ashley 0
Ben 1
Conrad 2
Doug 3
Evin 4
Florian 5
Gerald 6
>>> df.set_index('name').T
name Ashley Ben Conrad Doug Evin Florian Gerald
id 0 1 2 3 4 5 6
>>> df.set_index('name').loc['Doug']
id 3
Name: Doug, dtype: int64
答案 5 :(得分:1)
字典列表的第一个选项会因为很少的原因而更好。 List确实提供了诸如EXTEND,APPENT,PUSH之类的方法,这些方法不适用于词典。