在pandas系列中使用if/else根据条件创建新系列
Using if/else in pandas series to create new series based on conditions
我有一个 pandas df。
假设我有一个 "activity" 列,它可以是 "fun" 或 "work",我想将它转换为整数。
我做的是:
df["activity_id"] = 1*(df["activity"]=="fun") + 2*(df["activity"]=="work")
这可行,因为我不知道如何在其中放置 if/else(如果您有 10 个活动,它会变得复杂)。
但是,假设我现在有相反的问题,我想从 id 转换为字符串,我不能再使用这个技巧了,因为我不能将字符串与布尔值相乘。我该怎么做?有没有办法使用 if/else?
您可以创建一个以id为键,字符串为值的字典,然后使用map
系列方法将整数转换为字符串。
my_map = {1:'fun', 2:'work'}
df['activity']= df.activity_id.map(my_map)
您可以将 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
您还可以使用字典和列表理解来重新计算整个列的值。这也使得定义反向映射变得容易:
>>> 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
我有一个 pandas df。 假设我有一个 "activity" 列,它可以是 "fun" 或 "work",我想将它转换为整数。 我做的是:
df["activity_id"] = 1*(df["activity"]=="fun") + 2*(df["activity"]=="work")
这可行,因为我不知道如何在其中放置 if/else(如果您有 10 个活动,它会变得复杂)。
但是,假设我现在有相反的问题,我想从 id 转换为字符串,我不能再使用这个技巧了,因为我不能将字符串与布尔值相乘。我该怎么做?有没有办法使用 if/else?
您可以创建一个以id为键,字符串为值的字典,然后使用map
系列方法将整数转换为字符串。
my_map = {1:'fun', 2:'work'}
df['activity']= df.activity_id.map(my_map)
您可以将 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
您还可以使用字典和列表理解来重新计算整个列的值。这也使得定义反向映射变得容易:
>>> 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