如何在Pandas DataFrame中用另一列值截取字符串长度?
哈哈,这个坑我刚学Pandas的时候也踩过!你遇到的TypeError,本质是因为Pandas的Series切片逻辑和普通Python字符串切片完全不一样——你想用df['String'][:df['String Limit']]逐行截断,但Pandas会把整个String Limit列当成索引范围参数来解析,而不是逐行取对应的值去截断字符串,自然就报错了。
给你两个实用的解决方法:
方法一:用apply逐行处理(直观易读)
这是最容易理解的方式,用apply按行遍历数据框,每一行里拿对应的限制长度去截断字符串:
import pandas as pd data = [[5, 'LONSTRING'], [3, 'LONGERSTRING'], [7, 'LONGESTSTRINGEVER']] df = pd.DataFrame(data, columns=['String Limit', 'String']) # 按行处理,axis=1表示横向遍历每一行 df['Short String'] = df.apply(lambda row: row['String'][:row['String Limit']], axis=1) print(df)
方法二:列表推导式+zip(性能更优)
如果你的数据集比较大,列表推导式的速度会比apply快不少——它是纯Python层面的循环,开销更小:
# 把两列的元素一一配对,逐个截断 df['Short String'] = [s[:limit] for s, limit in zip(df['String'], df['String Limit'])]
最终效果
两种方法都能得到你预期的结果:
String Limit String Short String 0 5 LONSTRING LONST 1 3 LONGERSTRING LON 2 7 LONGESTSTRINGEVER LONGEST
再啰嗦一句为啥原来的写法不行:df['String'][:X]里的X必须是单个整数(用来指定索引位置的截止点),但你传入的是一整列数据(Series),Pandas没法把一个Series当成索引范围来用,所以直接抛出了TypeError。
内容的提问来源于stack exchange,提问作者Nichlas H.
相关产品推荐
相关产品推荐

