【问题标题】:Using if/else in pandas series to create new series based on conditions在 pandas 系列中使用 if/else 根据条件创建新系列
【发布时间】:2017-05-05 01:28:35
【问题描述】:

我有一个熊猫 df。 假设我有一列“活动”,可以是“有趣”或“工作”,我想将其转换为整数。 我要做的是:

df["activity_id"] = 1*(df["activity"]=="fun") + 2*(df["activity"]=="work") 

这行得通,因为我不知道如何在其中放置 if/else(如果您有 10 个活动,它可能会变得复杂)。

但是,假设我现在遇到了相反的问题,并且我想从 id 转换为字符串,我不能再使用这个技巧,因为我不能将字符串与布尔值相乘。我该怎么做?有没有办法使用 if/else?

【问题讨论】:

    标签: python pandas series


    【解决方案1】:

    您可以创建一个以id为键,字符串为值的字典,然后使用map系列方法将整数转换为字符串。

    my_map = {1:'fun', 2:'work'}
    
    df['activity']= df.activity_id.map(my_map)
    

    【讨论】:

    • 这是最好和最简单的答案。
    【解决方案2】:

    您可以改为将 activity 列转换为 categorical dtype

    df['activity'] = pd.Categorical(df['activity'])
    

    然后您将自动通过df['activity'].cat.codes 访问值的整数标签。


    import pandas as pd
    
    df = pd.DataFrame({'activity':['fun','work','fun']})
    df['activity'] = pd.Categorical(df['activity'])
    
    print(df['activity'].cat.codes)
    0    0
    1    1
    2    0
    dtype: int8
    

    同时saving memory:

    print(df)
    

    仍然有收获

      activity
    0      fun
    1     work
    2      fun
    

    【讨论】:

      【解决方案3】:

      您还可以使用字典和列表推导来重新计算整个列的值。这也使得定义反向映射变得容易:

      >>> import pandas as pd
      >>> forward_map = {'fun': 1, 'work': 2}
      >>> reverse_map = {v: k for k, v in forward_map.iteritems()}
      >>> df = pd.DataFrame(
          {'activity': ['work', 'work', 'fun', 'fun', 'work'],
           'detail': ['reports', 'coding', 'hiking', 'games', 'secret games']})
      >>> df
      
        activity        detail
      0     work       reports
      1     work        coding
      2      fun        hiking
      3      fun         games
      4     work  secret games
      
      >>> df['activity'] = [forward_map[i] for i in df['activity']]
      >>> df
      
         activity        detail
      0         2       reports
      1         2        coding
      2         1        hiking
      3         1         games
      4         2  secret games
      
      >>> df['activity'] = [reverse_map[i] for i in df['activity']]
      >>> df
      
        activity        detail
      0     work       reports
      1     work        coding
      2      fun        hiking
      3      fun         games
      4     work  secret games
      

      【讨论】:

        猜你喜欢
        • 2014-03-09
        • 2020-12-21
        • 1970-01-01
        • 2021-06-11
        • 1970-01-01
        • 2021-12-28
        相关资源
        最近更新 更多