【问题标题】:PANDAS - using map and ignore case sensitivityPANDAS - 使用地图并忽略区分大小写
【发布时间】:2022-12-16 01:32:03
【问题描述】:

我有一个数据框:

df1 = pd.DataFrame({'Item': ["jetties","Jetty", "Joint use"], 'Team': ["Team_1", "Team_2", "Team_1"]})
df2 = pd.DataFrame({'Item': ["Jetty","Jetties","Joint use"]})

我正在应用地图以返回 df2 中的团队值:

df2['Team'] = df2['Item'].map(df1.set_index('Item')['Team'])

但是,由于区分大小写,结果是给我 Nan for Jetties。 有什么办法可以忽略大小写吗?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以将密钥转换为定义的大小写:

    df2['Team'] = (df2['Item'].str.lower()
                   .map(df1.assign(Item=df1['Item'].str.lower())
                           .set_index('Item')['Team'])
                  )
    

    输出:

            Item    Team
    0      Jetty  Team_2
    1    Jetties  Team_1
    2  Joint use  Team_1
    

    【讨论】:

      【解决方案2】:
      df = pd.merge(df1, df2, left_on=df1['Item'].str.lower(), right_on=df2['Item'].str.lower(), how='left').drop(['key_0', 'Item_x'], axis=1).rename(columns={'Item_y': 'Item'})
      df = df[['Item', 'Team']]
      df
      

      大多数时候我更喜欢连接数据而不是使用地图

      【讨论】:

        【解决方案3】:

        扩展 mozway 的答案,最好按如下方式调用分配函数。如有必要,这将有助于稍后将逻辑重构为函数。

        df2["Team"] = ( 
            df2["Item"]
            .str.lower()
            .map(df1.assign(**{"Item": df1["Item"].str.lower()}).set_index("Item")["Team"])
        )
        

        例如

        import pandas as pd
        
        df1 = pd.DataFrame(
            {"Item": ["jetties", "Jetty", "Joint use"], "Team": ["Team_1", "Team_2", "Team_1"]}
        )
        print("df1")
        print(df1)
        
        df2 = pd.DataFrame({"Item": ["Jetty", "Jetties", "Joint use"]})
        print("df2")
        print(df2)
        
        
        def map_series(s, df, key_col, value_col, ignore_case):
            if ignore_case:
                result = s.str.lower().map(
                    df.assign(**{key_col: df[key_col].str.lower()}).set_index(key_col)[
                        value_col
                    ]
                )
            else:
                result = s.map(df.set_index(key_col)[value_col])
            return result
        
        
        df2["Team_include_case"] = map_series(
            df2["Item"], df1, "Item", "Team", ignore_case=False
        )
        df2["Team_ignore_case"] = map_series(df2["Item"], df1, "Item", "Team", ignore_case=True)
        print("after mapping")
        print(df2)
        

        示例输出

        df1
                Item    Team
        0    jetties  Team_1
        1      Jetty  Team_2
        2  Joint use  Team_1
        df2
                Item
        0      Jetty
        1    Jetties
        2  Joint use
        after mapping
                Item Team_include_case Team_ignore_case
        0      Jetty            Team_2           Team_2
        1    Jetties               NaN           Team_1
        2  Joint use            Team_1           Team_1
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-03-09
          • 1970-01-01
          • 1970-01-01
          • 2017-05-30
          • 2019-12-03
          • 2012-03-28
          相关资源
          最近更新 更多