首页 > 解决方案 > 如何修改一列中的多个值,但在pandas python中跳过其他值

问题描述

在 python 中学习了两个月,我现在正专注于Pandas。在我目前的职位上,我在数据帧上使用 VBA,因此学习它以慢慢取代它并促进我的职业生涯。到目前为止,我相信我真正的问题是缺乏对关键概念的理解。任何帮助将不胜感激。

这就是我的问题:

我可以去哪里了解更多关于如何做这样的事情以获得更精确的过滤。我非常接近,但我需要一个关键方面。

目标

主要目标我需要跳过我的 ID 列中的某些值。 下面的代码去掉了破折号“-”,最多只能读取 9 位数字。但是,我需要跳过某些 ID,因为它们是唯一的。

之后,我将开始比较多张纸。

我需要跳过的唯一 ID 在两个数据帧中是相同的,但格式完全不同,范围为 000-000-000_#12、000-000-000_35 或 000-000-000_z。

我将在每个 ID 上使用的代码(唯一 ID 除外):

 dfSS["ID"] = dfSS["ID"].str.replace("-", "").str[:9]

但我想使用类似的 if 语句(这不起作用)

lst = ["000-000-000_#69B", "000-000-000_a", "etc.. random IDs", ]

if ~dfSS["ID"].isin(lst ).any()
    dfSS["ID"] = dfSS["ID"].str.replace("-", "").str[:9]
else:
    pass

为了更清楚,我的输入 DataFrame 是这样的:

            ID               Street #   Street Name 
0   004-330-002-000         2272        Narnia  
1   021-521-410-000_128     2311        Narnia  
2   001-243-313-000         2235        Narnia  
3   002-730-032-000         2149        Narnia
4   000-000-000_a           1234        Narnia

我希望将其作为输出:

            ID               Street #   Street Name 
0   004330002               2272        Narnia  
1   021-521-410-000_128     2311        Narnia  
2   001243313000            2235        Narnia  
3   002730032000            2149        Narnia
4   000-000-000_a           1234        Narnia

笔记:

这是我一直在研究这个的地方:

标签: pythonpandasfilteringreisin

解决方案


有很多方法可以做到这一点。这里的第一种方法不涉及编写函数。

# Create a placeholder column with all transformed IDs
dfSS["ID_trans"] = dfSS["ID"].str.replace("-", "").str[:9]
dfSS.loc[~dfSS["ID"].isin(lst), "ID"] = dfSS.loc[~dfSS["ID"].isin(lst), "ID_trans"] # conditional indexing

第二种方法是编写一个有条件地转换ID的函数,它没有第一种方法那么快。

def transform_ID(ID_val):
    if ID_val not in lst:
        return ID_val.replace("-", "")[:9]

dfSS['ID_trans'] = dfSS['ID'].apply(transform_ID)

推荐阅读