向Pandas DataFram添加小列表的最佳方法

2024-10-02 12:24:29 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

为了举例说明,假设我有一个数据帧,其中用户的宠物列表存储为字符串,我们希望解析出单个动物并将其存储为列表。其思想是存储解析字符串的结果,这样实际的解析例程只需运行一次。在

# Original Dataframe
User   | PetsString
----------------------
Mary   | 'dog/cat/rat'
John   | 'dog/lizard'

方法1)我可以向dataframe添加一列,并将列表存储在该列中。在

^{pr2}$

方法2)我可以创建另一个包含列表项的dataframe,其中一个列指示日志在原始数据帧中的位置,以供corss引用。我想避免这种情况,因为我假设同时迭代两个数据帧比迭代单个大列表慢。E、 g

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)有人建议在我现有的dataframe中添加50列,并将每个列表项存储在其中一列中。我不希望有超过50个头参数。这似乎是速度最优的,但在列数方面有严重的限制。E、 g

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没有

我知道这些东西很多可能是特定于我的特定处理器、缓存大小、用例等的,但即使是对权衡的一般理解也会对我非常有用

提前感谢您的帮助!在


Tags: 数据方法dataframepandas列表参数john事务
1条回答
网友
1楼 · 发布于 2024-10-02 12:24:29

Pandas数据帧的列中的值存储在同构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')

这表明:

  1. 当您存储不同长度的字符串时,Pandas使用一个numpy对象数组(numpy也有同样大小的字符串的字符串数组,但是Pandas不使用它们)。

  2. 当您存储列表时,Pandas还使用numpy对象数组。

基于此,我认为你的第一个选择将有良好的内存和速度性能。Pandas和numpy与常规Python数据结构相比具有优势,比如在巨大的数字序列中,单个数字对象的Python开销是巨大的。字符串的Python list相当高效,而一个由(非固定大小)字符串组成的numpy数组并没有真正的优势。在

事实上,您可能会考虑熊猫在这里是否比普通的香草Python有任何优势。例如,dict为什么不将字符串映射到字符串的lists呢?在

相关问题 更多 >

    热门问题