在pandas列内映射值

时间:2018-07-25 20:34:58

标签: python pandas dictionary data-science

我使用下面的代码将S列中的2个值映射为0,但是它不起作用。关于如何解决这个问题的任何建议? N.B:我想在地图内部实现外部功能。

 df = pd.DataFrame({
   'Age': [30,40,50,60,70,80],
   'Sex': ['F','M','M','F','M','F'],
   'S'  : [1,1,2,2,1,2]
 })
 def app(value):
     for n in df['S']:
         if n == 1:
             return 1
         if n == 2:
             return 0
 df["S"] = df.S.map(app)

8 个答案:

答案 0 :(得分:2)

不要使用 apply ,只需使用 loc 来分配值即可:

df.loc[df.S.eq(2), 'S'] = 0

   Age Sex  S
0   30   F  1
1   40   M  1
2   50   M  0
3   60   F  0
4   70   M  1
5   80   F  0

如果您需要性能更高的选项,请使用 np.select 。这也更具可扩展性,因为您可以随时添加更多条件:

df['S'] = np.select([df.S.eq(2)], [0], 1)

答案 1 :(得分:2)

使用eq创建一个布尔序列,并将该布尔序列转换为astype的整数:

df['S'] = df['S'].eq(1).astype(int)

OR

df['S'] = (df['S'] == 1).astype(int)

输出:

   Age Sex  S
0   30   F  1
1   40   M  1
2   50   M  0
3   60   F  0
4   70   M  1
5   80   F  0

答案 2 :(得分:1)

您已经接近,但需要进行一些更正。由于要使用函数,因此请删除for循环并将n替换为value。另外,使用apply代替mapApply一次对整个列进行操作。有关如何正确使用apply vs applymap vs map的信息,请参见此answer

def app(value):
    if value == 1:
        return 1
    elif value == 2:
        return 0
df['S'] = df.S.apply(app)
   Age Sex  S
0   30   F  1
1   40   M  1
2   50   M  0
3   60   F  0
4   70   M  1
5   80   F  0

答案 3 :(得分:0)

您可以这样做:

import numpy as np

df['S'] = np.where(df['S'] == 2, 0, df['S'])

答案 4 :(得分:0)

如果只希望更改等于2的值,则可以使用pd.DataFrame.loc

df.loc[df['S'] == 0, 'S'] = 0
不建议使用

pd.Series.apply,这只是一个面纱微弱,效率低下的循环。

答案 5 :(得分:0)

您可以使用.replace,如下所示: df [“ S”] = df [“ S”]。replace([2],0) 这将在一行中将所有2个值替换为0

答案 6 :(得分:0)

进行矢量化numpy操作

df['S'] = np.abs(df['S'] - 2)

并在竞争中脱颖而出并获得答案:)

答案 7 :(得分:0)

>>>df = pd.DataFrame({'Age':[30,40,50,60,70,80],'Sex': 
 ['F','M','M','F','M','F'],'S': 
 [1,1,2,2,1,2]})


>>> def app(value):
        return 1 if value == 1 else 0 
    # or app = lambda value : 1 if value == 1 else 0

>>> df["S"] = df["S"].map(app)

>>> df 
   Age  S Sex
      Age  S Sex
   0   30  1   F
   1   40  1   M
   2   50  0   M
   3   60  0   F
   4   70  1   M
   5   80  0   F