Python 将小列表添加到数据帧的最佳方法
我正在将一些包含HTTP事务的日志解析为一个数据帧。每一行是一个事务,因此一列有IP地址,另一列有主机名,等等。对于每一行(日志条目),我想将标题参数提取到一个列表中,并将该列表与该行的其余信息一起存储 问题是:如何存储参数列表,以便可以轻松地与日志中的其余数据交叉引用 举个例子,假设我有一个数据框,其中一个用户的宠物列表存储为一个字符串,我们想要解析出单个动物并将其存储为一个列表。其思想是存储解析字符串的结果,以便实际的解析例程只需运行一次Python 将小列表添加到数据帧的最佳方法,python,pandas,Python,Pandas,我正在将一些包含HTTP事务的日志解析为一个数据帧。每一行是一个事务,因此一列有IP地址,另一列有主机名,等等。对于每一行(日志条目),我想将标题参数提取到一个列表中,并将该列表与该行的其余信息一起存储 问题是:如何存储参数列表,以便可以轻松地与日志中的其余数据交叉引用 举个例子,假设我有一个数据框,其中一个用户的宠物列表存储为一个字符串,我们想要解析出单个动物并将其存储为一个列表。其思想是存储解析字符串的结果,以便实际的解析例程只需运行一次 # Original Dataframe User
# Original Dataframe
User | PetsString
----------------------
Mary | 'dog/cat/rat'
John | 'dog/lizard'
方法1)我可以向数据帧添加一列,并将列表存储在此列中
User | PetsString | PetsList
--------------------------------------------
Mary | 'dog/cat/rat' | ['dog','cat','rat']
John | 'dog/lizard' | ['dog','lizard']
方法2)我可以创建另一个包含列表项的数据框,其中有一列指示日志在原始数据框中的位置,以供corss引用。我希望避免这种情况,因为我假设同时迭代两个数据帧要比迭代单个大列表慢。例如
User | PetsString
-----------------------
Mary | 'dog/cat/rat'
John | 'dog/lizard'
#Separate DataFrame for cross-reference
User | Pet
-----------------
Mary | 'dog'
Mary | 'cat'
Mary | 'rat'
John | 'dog'
John | 'lizard'
方法3)有人建议,比如说,在我现有的数据框架中添加50列,并将每个列表项存储在其中一列中。我不希望有超过50个标题参数。这似乎是最理想的速度,但在列的数量上有着令人讨厌的限制。例如
User | PetsString | Pet0 | Pet1 | Pet2
------------------------------------------------------
Mary | 'dog/cat/rat' | 'dog' | 'cat' | 'rat'
John | 'dog/lizard' | 'dog' | 'lizard' |
我有两个问题:
(i)假设我需要计算一个函数,该函数将从相应列表中读取一行和所有参数,那么三种布局中哪一种是速度最优的
(ii)以下哪一项是空间最优的?我不确定Pandas如何处理对象,但我相信如果我使用方法1,Pandas将创建一个与最长列表一样宽的列。类似地,方法3必须为完整的“Pet2”列分配空间,即使John没有
我知道这些东西中有很多可能是特定于我的特定处理器、缓存大小、用例等的,但即使是对折衷的一般理解对我来说也是非常有用的
提前感谢您的帮助 数据帧列中的值存储在同构numpy数组中。考虑以下事项:
In [95]: pd.DataFrame({'a': ['foo', 'bar/baz']}).a.dtype
Out[95]: dtype('O')
In [96]: pd.DataFrame({'a': [['foo'], ['bar', 'baz']]}).a.dtype
Out[96]: dtype('O')
这表明:
list
的字符串非常有效,而numpy数组(非固定大小)的字符串并不比它更有优势
事实上,你可能会考虑熊猫是否在这里提供了优于普通香草蟒蛇的优势。例如,为什么不使用
dict
将字符串映射到列表
s个字符串?感谢您的回复!现在我可以看出,字符串列表对熊猫来说并不是那么好。Numpy有一个固定宽度字符串的数据类型,但在使用Pandas时,这些字符串被存储为类型“object”,因此在我的例子中,Pandas比Python没有多少速度提升。在这一点上,我坚持使用它,因为我已经编写了一半的代码来使用Pandas。