【问题标题】:Python/Pandas: assign new column's value using information from one of three listsPython/Pandas:使用来自三个列表之一的信息分配新列的值
【发布时间】:2019-01-26 02:45:03
【问题描述】:

我想在 pandas DataFrame 中创建一个新列。名为"Region" 的新列将指示列"City name" 中的值所属的区域。

我有三个列表,分别对应三个不同的区域:北部、南部和西部。每个地区都包含不同的国家/地区字符串。

我该怎么做?我找到了this example,但它只与属于一个且只有一个列表的项目有关。就我而言,项目可以属于三个列表之一。

这是我的尝试:

df["Region"] = pd.np.where(df["City name"].isin(N), "North", "")
df["Region"] = pd.np.where(df["City name"].isin(S), "South", "")
df["Region"] = pd.np.where(df["City name"].isin(W), "West", "")

我的问题是第二行覆盖了第一行,以此类推。

【问题讨论】:

  • 可能想要np.select 你能发布一个带有所需输出的数据框的小样本吗?但是,您也可以将空字符串替换为 df['Region'],这不会覆盖任何内容(但 select 更好)
  • 什么是 N、S、W?你能提供一个minimal reproducible example吗?

标签: python pandas


【解决方案1】:

由于你没有太多的结果,你可以结合所有三个条件:

df["Region"] = pd.np.where(df["City name"].isin(N), "North", 
                   pd.np.where(df["City name"].isin(S), "South", 
                       pd.np.where(df["City name"].isin(W), "West", np.nan)))

【讨论】:

    【解决方案2】:

    设置

    df = pd.DataFrame({'city name': ['Toronto', 'San Jose', 'Houston', 'Dallas']})
    N = ['Toronto']
    S = ['Houston', 'Dallas']
    W = ['San Jose']
    

    使用np.select

    c1 = df['city name'].isin(N)
    c2 = df['city name'].isin(S)
    c3 = df['city name'].isin(W)
    
    df.assign(region=np.select([c1, c2, c3], ['North', 'South', 'West']))
    

    输出:

      city name region
    0   Toronto  North
    1  San Jose   West
    2   Houston  South
    3    Dallas  South
    

    【讨论】:

      【解决方案3】:

      使用来自 user3483203 的数据

      meltdf=pd.DataFrame({'North':N,'South':S,'West':W}).melt()
      df.merge(meltdf,left_on='city',right_on='value',how='left')
      Out[244]: 
           city variable   value
      0  City A    North  City A
      1  City B    South  City B
      2  City C     West  City C
      

      如果列表长度不同

      meltdf改成

      meltdf=pd.DataFrame.from_dict({'North':N,'South':S,'West':W},'index').stack().reset_index()
      
      df.merge(meltdf[['level_0',0]],left_on='city',right_on='level_0',how='left')
      

      【讨论】:

        【解决方案4】:

        基于map 的解决方案怎么样?

        mp = {k: lbl
              for lst, lbl in [(N, 'North'), (S, 'South'), (E, 'East'), (W, 'West')]
              for k in lst}
        
        df['region'] = df['city name'].map(mp)
        
          city name region
        0   Toronto  North
        1  San Jose   West
        2   Houston  South
        3    Dallas  South
        

        如果您可以通过一些最少的预处理来设置地图,则基于地图的替换会很快。

        (来自@user3483203 的数据。)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-07-18
          • 2021-05-12
          • 2019-01-02
          • 2015-10-23
          • 1970-01-01
          • 2019-08-20
          • 1970-01-01
          • 2018-05-09
          相关资源
          最近更新 更多