0%

在一些方法当中会使用到 axis, 一开始的时候会对这个参数的意义很模糊,现在罗列出来,做一下初步的讲解。

1
2
3
4
def func(x, y ):
return x + y

df['col3'] = df.apply(lambda x: func(x['col1] + x['col2']), axis = 1)

axis默认为0,代表参数x为一列。
axis=1时,代表参数为一行。

筛选数据时的与或非

1
2
3
4
5
6
7
And_df = df[(df['Rating']>5) & (df['Votes']>100000)]

# 多个条件: OR - 满足评分高于5分或者投票大于100000的
Or_df = df[(df['Rating']>5) | (df['Votes']>100000)]

# 多个条件:NOT - 将满足评分高于5分或者投票大于100000的数据排除掉
Not_df = df[~((df['Rating']>5) | (df['Votes']>100000))]
1
df[len(df['Title'].split(" "))>=5] # 报错 AttributeError: 'Series' object has no attribute 'split'

很容易看得出来,df[‘Title’]是一列,是一个Series,所以没有split方法。

是否可以用 df['Title'].str.split(" ") ??

可以通过如下方法来解决。

1
2
3
4
5
#创建一个新的列来存储每一影片名的长度
df['num_words_title'] = df.apply(lambda x : len(x['Title'].split(" ")),axis=1)

#筛选出影片名长度大于5的部分
new_df = df[df['num_words_title']>=5]

x代表一行了,x[‘Title’]就是一个字符串了。

复杂筛选

筛选出那些影片的票房低于当年平均水平的数据。

我们先要对每年票房的的平均值做一个归总

1
year_revenue_dict = df.groupby(['Year']).agg({'Revenue(Millions)':np.mean}).to_dict()['Revenue(Millions)']

然后我们定义一个函数来判断是否存在该影片的票房低于当年平均水平的情况,返回的是布尔值

1
2
def bool_provider(revenue, year):
return revenue<year_revenue_dict[year]

然后我们通过结合apply方法和lambda方法应用到数据集当中去

1
new_df = df[df.apply(lambda x : bool_provider(x['Revenue(Millions)'], x['Year']), axis = 1)]

方法调用过程的可视化

1
2
3
4
from tqdm import tqdm, tqdm_notebook
tqdm_notebook().pandas()

df["CustomRating"] = df.progress_apply(lambda x: custom_rating(x['Genre'],x['Rating']),axis=1)

villa n. 别墅
cottage n. 小别墅;村舍,小屋

cookery n. 烹饪术
fishery n. 渔场

inspiration n. 灵感;鼓舞人心的人或事
aspiration n.

dedicate v. 致力,献身
dedicated adj. 专注的,投入的,专用的,献身的
delicate adj. 脆弱的; 虚弱的; 纤细的; 精致的; 熟练的; 娇美的; 柔和的; 鲜美的; 清香的; 微妙的; 技巧性很强的
delicately adv. 优美地,精致地,微妙地

gum n. 口香糖
gym n. 健身房; 体育馆; 室内健身操; 体操

noticeable adj. 明显的,显著的;引人注目的;值得注意的
obvious adj.