![](/img/trans.png)
[英]'NoneType' object is not subscriptable df.apply(lambda row: (row)[0], axis=1)
[英]Python: What is the difference between df[‘Col’].apply(lambda row: len(row)) and df.apply(lambda row: len(row[‘Col’]), axis=1)?
df = pd.DataFrame([['user1', 'Hey whats up I am Rob', 73],
['user2', 'Hey whats up I am Bob', 44],
['user3', 'Hey whats up I am a Snob', 12]],
columns=['User', 'Text', 'Age'])
#Method 1
df['TextLen'] = df['Text'].apply(lambda row: len(row))
#Method 2
df['TextLen2'] = df.apply(lambda row: len(row['Text']), axis=1)
print(df)
结果:
User Text Age TextLen TextLen2
0 user1 Hey whats up I am Rob 73 21 21
1 user2 Hey whats up I am Bob 44 21 21
2 user3 Hey whats up I am a Snob 12 24 24
方法一和方法二有什么区别?
哪个更 Pythonic / 我应该在大型数据集上使用哪个?
在jupyter notebook中使用%%timeit魔法,我对你的两种方法中的每一种都进行了计时。 方法一比方法二快很多。
我还发现列表理解的速度是方法 1 的两倍。请参见下面的方法 3...
方法 1(更快)
%%timeit
df['TextLen'] = df['Text'].apply(lambda row: len(row))
#434 µs ± 6.73 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
方法 2(较慢)
%%timeit
df['TextLen2'] = df.apply(lambda row: len(row['Text']), axis=1)
#1.24 ms ± 19.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
方法 3(最快)
%%timeit
df['TextLen3'] = [len(i) for i in df['Text']]
#202 µs ± 4.48 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
方法 4(快速但可读)
%%timeit
df['TextLen4'] = df['Text'].str.len()
#525 µs ± 53.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
我在您运行这些测试时使用了样本示例数据。
编辑 1:我尝试了第三种方法并认为它更快,然后才意识到它不起作用。 我已将其从答案中删除。
编辑 2:我尝试了列表理解方法(方法 3)并确定它有效,所以我将其添加到答案中
编辑 3:在 OP 评论中建议的方法(方法 4)中添加
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.