代码下载

https://github.com/hidadeng/DaDengAndHisPython/tree/master/20211031如何在DataFrame中使用If-Else条件语句创建新列


有时我们希望根据 DataFrame 其他列(字段) 的值向 DataFrame 添加一列。

虽然这听起来很简单,但如果我们尝试使用 if-else 条件来完成它可能会变得有点复杂。 值得庆幸的是,使用 numpy 两个函数np.where()、np.select() 就能实现这一需求。

导入数据

我们有一个包含 4,000 多条 Dataquest 推文的数据集,字段包括:

  • date twitter发送的日期
  • time 推文发送时间
  • tweet 推文内容
  • mentions 谁提到了该推文
  • photos 图片链接
  • replies_count 推文回复数
  • retweets_count 推文再转发数
  • likes_count 推文获得的点赞数
import pandas as pd
import numpy as np

df = pd.read_csv('tweets.csv')
df.head()



问题

我们看到数据集中的photos字段是图片链接

  • 如果某条记录有信息,会显示图片链接列表
  • 如果不含图片,该字段对应的数据是空列表

我们只想查看带有图片的推文是否获得更多交互,因此我们实际上并不需要图片 URL。 让我们尝试创建一个名为 has_image 的新列,该列将包含布尔值

  • 如果推文包含图像,则为 True,否则为 False。

那么我们如何创建一个has_image字段?



np.where()

np.where(condition, value if condition is true, value if condition is false)

为此,我们将使用 numpy 的内置 where() 函数。 这个函数依次接受三个参数:我们要测试的条件,如果条件为真则分配给新列的值,如果条件为假则分配给新列的值。 它看起来像这样:

df['has_image'] = np.where(df['photos']!='[]', True, False)
df.head()

np.select()

这种方法很好用,但如果我们新建列的值不止True、False呢?

例如我们把likes_count 进行分类,不同取值范围定义为不同的类别

  • tier_4 少于2个赞
  • tier_3 3-9 个赞
  • tier_2 10-15 个赞
  • tier_1 16+ 个赞

为此,我们可以使用名为 np.select() 的函数。我们将给它两个参数:一个我们的条件列表,以及一个我们想要分配给新列中每一行的值的相关列表。

这意味着顺序很重要:如果满足条件列表中的第一个条件,则值列表中的第一个值将分配给该行的新列。如果满足第二个条件,则将分配第二个值,依此类推。

让我们来看看它在 Python 代码中的表现:

# create a list of our conditions
conditions = [
    (df['likes_count'] <= 2),
    (df['likes_count'] > 2) & (df['likes_count'] <= 9),
    (df['likes_count'] > 9) & (df['likes_count'] <= 15),
    (df['likes_count'] > 15)
    ]

# create a list of the values we want to assign for each condition
values = ['tier_4', 'tier_3', 'tier_2', 'tier_1']

# create a new column and use np.select to assign values to it using our lists as arguments
df['tier'] = np.select(conditions, values)

# display updated DataFrame
df.head()

广而告之