Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将小列表添加到数据帧的最佳方法_Python_Pandas - Fatal编程技术网

Python 将小列表添加到数据帧的最佳方法

Python 将小列表添加到数据帧的最佳方法,python,pandas,Python,Pandas,我正在将一些包含HTTP事务的日志解析为一个数据帧。每一行是一个事务,因此一列有IP地址,另一列有主机名,等等。对于每一行(日志条目),我想将标题参数提取到一个列表中,并将该列表与该行的其余信息一起存储 问题是:如何存储参数列表,以便可以轻松地与日志中的其余数据交叉引用 举个例子,假设我有一个数据框,其中一个用户的宠物列表存储为一个字符串,我们想要解析出单个动物并将其存储为一个列表。其思想是存储解析字符串的结果,以便实际的解析例程只需运行一次 # Original Dataframe User

我正在将一些包含HTTP事务的日志解析为一个数据帧。每一行是一个事务,因此一列有IP地址,另一列有主机名,等等。对于每一行(日志条目),我想将标题参数提取到一个列表中,并将该列表与该行的其余信息一起存储

问题是:如何存储参数列表,以便可以轻松地与日志中的其余数据交叉引用

举个例子,假设我有一个数据框,其中一个用户的宠物列表存储为一个字符串,我们想要解析出单个动物并将其存储为一个列表。其思想是存储解析字符串的结果,以便实际的解析例程只需运行一次

# 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')
这表明:

  • 当您存储不同长度的字符串时,Pandas使用对象的numpy数组(numpy也有大小相同的字符串数组,但Pandas不使用它们)

  • 存储列表时,Pandas还使用numpy对象数组

  • 基于此,我认为您的第一个选项将具有良好的内存和速度性能。Pandas和numpy与常规Python数据结构相比具有优势,比如在大型数字序列中,单个数字对象的Python开销非常大。Python
    list
    的字符串非常有效,而numpy数组(非固定大小)的字符串并不比它更有优势


    事实上,你可能会考虑熊猫是否在这里提供了优于普通香草蟒蛇的优势。例如,为什么不使用
    dict
    将字符串映射到
    列表
    s个字符串?

    感谢您的回复!现在我可以看出,字符串列表对熊猫来说并不是那么好。Numpy有一个固定宽度字符串的数据类型,但在使用Pandas时,这些字符串被存储为类型“object”,因此在我的例子中,Pandas比Python没有多少速度提升。在这一点上,我坚持使用它,因为我已经编写了一半的代码来使用Pandas。