Pandas根据基于其他列的条件添加值

Rut*_*ste 13 python pandas

我有以下pandas数据帧:

在此输入图像描述

import pandas as pd
import numpy as np

d = {'age' : [21, 45, 45, 5],
     'salary' : [20, 40, 10, 100]}

df = pd.DataFrame(d)
Run Code Online (Sandbox Code Playgroud)

并且想添加一个名为"is_rich"的额外列,该列根据他/她的工资来捕获一个人是否富裕.我找到了多种方法来实现这一目标:

# method 1
df['is_rich_method1'] = np.where(df['salary']>=50, 'yes', 'no')

# method 2
df['is_rich_method2'] = ['yes' if x >= 50 else 'no' for x in df['salary']]

# method 3
df['is_rich_method3'] = 'no'
df.loc[df['salary'] > 50,'is_rich_method3'] = 'yes'
Run Code Online (Sandbox Code Playgroud)

导致:

在此输入图像描述

但是我不明白首选的方式是什么.根据您的应用,所有方法都同样好吗?

cs9*_*s95 11

使用timeits,卢克!

小型DataFrame

def numpy_where(df):
  return df.assign(is_rich=np.where(df['salary'] >= 50, 'yes', 'no'))

def list_comp(df):
  return df.assign(is_rich=['yes' if x >= 50 else 'no' for x in df['salary']])

def loc(df):
  df = df.assign(is_rich='no')
  df.loc[df['salary'] > 50, 'is_rich'] = 'yes'
  return df
Run Code Online (Sandbox Code Playgroud)

最佳方法列表理解(最小开销)


大型DataFrame

def numpy_where(df):
  return df.assign(is_rich=np.where(df['salary'] >= 50, 'yes', 'no'))

def list_comp(df):
  return df.assign(is_rich=['yes' if x >= 50 else 'no' for x in df['salary']])

def loc(df):
  df = df.assign(is_rich='no')
  df.loc[df['salary'] > 50, 'is_rich'] = 'yes'
  return df
Run Code Online (Sandbox Code Playgroud)

def numpy_where(df):
  return df.assign(is_rich=np.where(df['salary'] >= 50, 'yes', 'no'))

def list_comp(df):
  return df.assign(is_rich=['yes' if x >= 50 else 'no' for x in df['salary']])

def loc(df):
  df = df.assign(is_rich='no')
  df.loc[df['salary'] > 50, 'is_rich'] = 'yes'
  return df
Run Code Online (Sandbox Code Playgroud)

最佳方法 - loc(矢量化,大型阵列的高性能)


总之,方法的适用性取决于您的数据.但是,您会惊讶于竞争列表理解如何 - 它们在C中实现并且针对性能进行了高度优化.