如何比较pandas中的两列来制作第三列?

Anu*_*dey 10 python pandas

我在熊猫数据框中有两列年龄和性别

sex = ['m', 'f' , 'm', 'f', 'f', 'f', 'f']
age = [16 ,  15 , 14 , 9  , 8   , 2   , 56 ]
Run Code Online (Sandbox Code Playgroud)

现在我想提取第三列:如果年龄<= 9则输出'child',如果年龄> 9,则输出相应的性别

sex = ['m', 'f'  , 'm','f'    ,'f'    ,'f'    , 'f']
age = [16 ,  15  , 14 , 9     , 8     , 2     , 56 ]
yes = ['m', 'f'  ,'m' ,'child','child','child','f' ]
Run Code Online (Sandbox Code Playgroud)

请帮助ps.我仍在努力,如果我得到任何东西,我会立即更新

roo*_*oot 17

用途numpy.where:

df['col3'] = np.where(df['age'] <= 9, 'child', df['sex'])
Run Code Online (Sandbox Code Playgroud)

结果输出:

   age sex   col3
0   16   m      m
1   15   f      f
2   14   m      m
3    9   f  child
4    8   f  child
5    2   f  child
6   56   f      f
Run Code Online (Sandbox Code Playgroud)

计时

使用以下设置获取更大的示例DataFrame:

np.random.seed([3,1415])
n = 10**5
df = pd.DataFrame({'sex': np.random.choice(['m', 'f'], size=n), 'age': np.random.randint(0, 100, size=n)})
Run Code Online (Sandbox Code Playgroud)

我得到以下时间:

%timeit np.where(df['age'] <= 9, 'child', df['sex'])
1000 loops, best of 3: 1.26 ms per loop

%timeit df['sex'].where(df['age'] > 9, 'child')
100 loops, best of 3: 3.25 ms per loop

%timeit df.apply(lambda x: 'child' if x['age'] <= 9 else x['sex'], axis=1)
100 loops, best of 3: 3.92 ms per loop
Run Code Online (Sandbox Code Playgroud)


Tim*_*chs 5

你可以使用pandas.DataFrame.where.例如

child.where(age<=9, sex)
Run Code Online (Sandbox Code Playgroud)

  • 这里的语法不正确.如果你想使用`DataFrame.where`,它应该是这样的:`df ['sex'].其中(df ['age']> 9,'child')`. (2认同)

rag*_*esz 5

df = pd.DataFrame({'sex':['m', 'f' , 'm', 'f', 'f', 'f', 'f'],
    'age':[16, 15, 14, 9, 8, 2, 56]})
df['yes'] = df.apply(lambda x: 'child' if x['age'] <= 9 else x['sex'], axis=1)
Run Code Online (Sandbox Code Playgroud)

结果:

   age sex    yes
0   16   m      m
1   15   f      f
2   14   m      m
3    9   f  child
4    8   f  child
5    2   f  child
6   56   f      f
Run Code Online (Sandbox Code Playgroud)