首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何确定pandas数据框列中列表的长度

如何确定pandas数据框列中列表的长度
EN

Stack Overflow用户
提问于 2016-12-27 14:48:16
回答 2查看 61.6K关注 0票数 78

如何在没有迭代的情况下确定列中列表的长度?

我有一个这样的数据帧:

代码语言:javascript
复制
                                                    CreationDate
2013-12-22 15:25:02                  [ubuntu, mac-osx, syslinux]
2009-12-14 14:29:32  [ubuntu, mod-rewrite, laconica, apache-2.2]
2013-12-22 15:42:00               [ubuntu, nat, squid, mikrotik]

我正在计算CreationDate列中列表的长度,并创建一个新的Length列,如下所示:

代码语言:javascript
复制
df['Length'] = df.CreationDate.apply(lambda x: len(x))

这给了我这样的结论:

代码语言:javascript
复制
                                                    CreationDate  Length
2013-12-22 15:25:02                  [ubuntu, mac-osx, syslinux]       3
2009-12-14 14:29:32  [ubuntu, mod-rewrite, laconica, apache-2.2]       4
2013-12-22 15:42:00               [ubuntu, nat, squid, mikrotik]       4

有没有更好的方法来做到这一点呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-27 15:03:41

您还可以将str访问器用于某些列表操作。在此示例中,

代码语言:javascript
复制
df['CreationDate'].str.len()

返回每个列表的长度。请参阅str.len的文档。

代码语言:javascript
复制
df['Length'] = df['CreationDate'].str.len()
df
Out: 
                                                    CreationDate  Length
2013-12-22 15:25:02                  [ubuntu, mac-osx, syslinux]       3
2009-12-14 14:29:32  [ubuntu, mod-rewrite, laconica, apache-2.2]       4
2013-12-22 15:42:00               [ubuntu, nat, squid, mikrotik]       4

对于这些操作,普通Python通常更快。不过,熊猫会处理NaNs。以下是时间安排:

代码语言:javascript
复制
ser = pd.Series([random.sample(string.ascii_letters, 
                               random.randint(1, 20)) for _ in range(10**6)])

%timeit ser.apply(lambda x: len(x))
1 loop, best of 3: 425 ms per loop

%timeit ser.str.len()
1 loop, best of 3: 248 ms per loop

%timeit [len(x) for x in ser]
10 loops, best of 3: 84 ms per loop

%timeit pd.Series([len(x) for x in ser], index=ser.index)
1 loop, best of 3: 236 ms per loop
票数 122
EN

Stack Overflow用户

发布于 2020-09-14 02:18:20

pandas.Series.str.len().相比,

  • pandas.Series.map(len)pandas.Series.apply(len)在执行时间上是相等的,并且略快一些

代码语言:javascript
复制
- [`pandas.Series.map`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.map.html)
- [`pandas.Series.apply`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.apply.html)
- [`pandas.Series.str.len`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.str.len.html)

代码语言:javascript
复制
import pandas as pd

data = {'os': [['ubuntu', 'mac-osx', 'syslinux'], ['ubuntu', 'mod-rewrite', 'laconica', 'apache-2.2'], ['ubuntu', 'nat', 'squid', 'mikrotik']]}
index = ['2013-12-22 15:25:02', '2009-12-14 14:29:32', '2013-12-22 15:42:00']

df = pd.DataFrame(data, index)

# create Length column
df['Length'] = df.os.map(len)

# display(df)
                                                              os  Length
2013-12-22 15:25:02                  [ubuntu, mac-osx, syslinux]       3
2009-12-14 14:29:32  [ubuntu, mod-rewrite, laconica, apache-2.2]       4
2013-12-22 15:42:00               [ubuntu, nat, squid, mikrotik]       4

%timeit

代码语言:javascript
复制
import pandas as pd
import random
import string

random.seed(365)

ser = pd.Series([random.sample(string.ascii_letters, random.randint(1, 20)) for _ in range(10**6)])

%timeit ser.str.len()
252 ms ± 12.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit ser.map(len)
220 ms ± 7.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit ser.apply(len)
222 ms ± 8.31 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41340341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档