如何用Pandas从DataFrame筛选指定长度字符串并转为列表
Pandas提取长度为2的唯一州代码最优实现
你的需求是从activities_df的park_states列中提取长度为2的唯一值,之前的写法没结合「过滤长度」和「去重」两个核心操作,所以达不到预期效果。以下是几种简洁高效的实现方式:
方式一:链式调用一步到位
直接过滤出长度为2的行,提取对应列后去重:
distinct_states = self.activities_df[self.activities_df["park_states"].str.len() == 2]["park_states"].unique()
方式二:用loc更安全规范
loc可以同时指定行筛选条件和列名,代码可读性更强:
distinct_states = self.activities_df.loc[self.activities_df["park_states"].str.len() == 2, "park_states"].unique()
方式三:转成Python列表(按需选择)
如果最终需要的是列表格式而非Numpy数组,加上tolist():
distinct_states = self.activities_df.loc[self.activities_df["park_states"].str.len() == 2, "park_states"].unique().tolist()
处理缺失值的场景
如果park_states列存在空值(NaN),可以先排除空值避免报错:
distinct_states = self.activities_df.loc[ self.activities_df["park_states"].notna() & (self.activities_df["park_states"].str.len() == 2), "park_states" ].unique().tolist()
你之前写法失效的原因
你之前的代码只完成了「过滤长度为2的行」这一步,但没有对提取出的列值做去重操作,得到的是所有符合长度条件的列值(包含重复项),和你原始循环「先取唯一值再过滤长度」的逻辑不一致。上面的写法把过滤和去重结合,完全等价于你原来的循环逻辑,且效率更高(Pandas矢量化操作远快于Python循环)。
内容的提问来源于stack exchange,提问作者KillerSheltie
相关产品推荐
相关产品推荐

