代码下载
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()