在pandas系列中使用if / else根据条件创建新系列

时间:2016-12-19 22:29:04

标签: python pandas series

我有一只熊猫df。 说我有一个专栏"活动"这可能是有趣的"或者"工作"我想将它转换为整数。 我所做的是:

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

这很有效,因为我不知道如何把if / else放在那里(如果你有10个活动就会变得复杂)。

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

3 个答案:

答案 0 :(得分:5)

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

my_map = {1:'fun', 2:'work'}

df['activity']= df.activity_id.map(my_map)

答案 1 :(得分: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

答案 2 :(得分:1)

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

class A 
   attr_accesor :foo

ActiveAdmin.register A
   controller do
      def index
         dataRecords = MyData.where("1=1")
         dataRecords.each do |data|
           data.foo = func()
         end
         @sortedData = dataRecords.sort_by{|data| data.foo}
      end
   end