dataframe 一列的不同值_根据条件增加DataFrame的列

编译:老齐

与本文有关的图书推荐:《跟老齐学Python:数据分析》

228471d3deccc0927ca42adb86ff96e7.png


当我们使用Python进行数据分析时,有时可能需要向DataFrame添加列,所添加的列要基于DataFrame的其他列的值。

虽然这听起来很简单,但是,不少初学想到的是用if-else条件语句来实现,这就把问题搞复杂了。有一个简单又有效的方法,下面就来看看这种方法如何使用。

加载一个数据集。

import pandas as pdimport numpy as npdf = pd.read_csv('dataquest_tweets_csv.csv')df.head()

ff296c1c6c618e81788e790b38b38dd6.png

数据集的各个特征含义是:

  • date:推文的发布日期
  • time:推文发布的时间
  • tweet:推文的文本内容
  • mentions:推文中提到的其他推特用户
  • photos:推文中所有图像的网址
  • replies_count:推文的回复数
  • retweets_count:推文的转发次数
  • likes_count:推文的点赞数

注意,photos特征的数据格式有点怪。

添加一列

在接下来的数据分析中,我们要看看带有图像的推文是否更吸引人,因此,实际上不需要图像文件的地址,只需要有一个特征,用以标明该样本是否含有图像即可。于是,创建一个名为hasimage的列,其中的值为:True——包含图像,False——不包含图像。

为此,使用Numpy的内置where()函数。这个函数依次接受三个参数:条件;如果条件为真,分配给新列的值;如果条件为假,分配给新列的值。

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

在数据集中,没有图像的推文在photos列中的值总是[]

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

49cbd09d5c2313b25e47042edb44d64f.png

如此,在数据集中新增加了一列,并且它正确地将包含图像的推文标记为True,其他的标记为False

现在已经有了hasimage列。再将有图文和无图文的两种类型的样本分别筛选出来:

image_tweets = df[df['hasimage'] == True]no_image_tweets = df[df['hasimage'] == False]

然后比较两类推文平均点赞数。

## LIKESprint('Average likes, all tweets: ' + str(df['likes_count'].mean()))print('Average likes, image tweets: ' + str(image_tweets['likes_count'].mean()))print('Average likes, no image tweets: ' + str(no_image_tweets['likes_count'].mean()))print('\n')## RETWEETSprint('Average RTs, all tweets: ' + str(df['retweets_count'].mean()))print('Average RTs, image tweets: ' + str(image_tweets['retweets_count'].mean()))print('Average RTs, no image tweets: ' + str(no_image_tweets['retweets_count'].mean()))Average likes, all tweets: 6.209759328770148Average likes, image tweets: 14.21042471042471Average likes, no image tweets: 5.176514584891549Average RTs, all tweets: 1.5553102230072864Average RTs, image tweets: 3.5386100386100385Average RTs, no image tweets: 1.2991772625280478

看来,有图像似乎可以让更多人来点赞。

再复杂一些

如果我们根据点赞的数量,将样本划分出不同等级,如:

  • tier_4 —  2个或更少的赞数
  • tier_3 — 3-9个赞数
  • tier_2 —  10-15个赞数
  • tier_1 — 16个以上的赞数

为此,使用一个名为np.select()的函数,给它提供两个参数:一个条件,另一个对应的等级列表。在conditions列表中的第一个条件得到满足,values列表中的第一个值将作为新特征中该样本的值,以此类推。具体代码如下:

# create a list of our conditionsconditions = [    (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 conditionvalues = ['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 argumentsdf['tier'] = np.select(conditions, values)# display updated DataFramedf.head()

7caf73ecbbaf17bdce448700359d79a7.png

这样,特征tier就标记了样本的等级,也可以理解为将样本离散化。于是,可以用它来回答与数据集有关的更多问题。例如:第1级和第4级有百分之多少的推文带有图像?

#tier 4 tweetsdf[(df['tier'] == 'tier_4')]['hasimage'].value_counts(normalize=True)
False    0.948784True     0.051216Name: hasimage, dtype: float64
#tier 1 tweetsdf[(df['tier'] == 'tier_1')]['hasimage'].value_counts(normalize=True)
False    0.836842True     0.163158Name: hasimage, dtype: float64

在这里,我们可以看到,虽然图像似乎有助于吸引关注,但它们似乎不是成功的必要条件。超过83%的“一级”推文——有16个以上点赞的推文——没有附带图片。

虽然这是一个非常肤浅的分析,但我们已经实现了真正的目标:根据已知数据的条件向DataFrame添加列。

当然,这是一项可以通过多种方式来完成的任务。np.where()np.select()只是其中的两种。这方面更多的内容,可以参考《跟老齐学Python:数据分析》一书。

参考链接:https://www.dataquest.io/blog/tutorial-add-column-pandas-dataframe-based-on-if-else-condition/


关注微信公众号:老齐教室

阅读更多精彩文章

d34f267a588699626040d381fa8cdcfd.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值