繁体   English   中英

Python:df['Col'].apply(lambda row: len(row)) 和 df.apply(lambda row: len(row['Col']), 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM