我使用下面的代码将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)
答案 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
代替map
。 Apply
一次对整个列进行操作。有关如何正确使用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