4 回答

TA貢獻(xiàn)1803條經(jīng)驗(yàn) 獲得超3個(gè)贊
groupby
這是和的潛在解決方案map
:
#filtering the data with >=3 ratings?
filtered_data = df[df['star_rating'] >= 3]
#creating a dict containing the counts of the all the favorable reviews
d = filtered_data.groupby('restaurant_id')['star_rating'].count().to_dict()
#mapping the dictionary to the restaurant_id to generate 'nb_fave_rating'
df['nb_fave_rating'] = df['restaurant_id'].map(d)
#taking care of `NaN` values?
df.fillna(0,inplace=True)
#making the column integer (just to match the requirements)
df['nb_fave_rating'] = df['nb_fave_rating'].astype(int)
print(df)
輸出:
? rating_id user_id restaurant_id? star_rating rating_year first_year last_year? nb_fave_rating
0? ? ? ? ?1? ? ? 56? ? ? ? ? ?xxx? ? ? ? ? 2.3? ? ? ? 2012? ? ? ?2012? ? ? 2020? ? ? ? ? ? ? ?1
1? ? ? ? ?2? ? ? 13? ? ? ? ? ?xxx? ? ? ? ? 3.7? ? ? ? 2012? ? ? ?2012? ? ? 2020? ? ? ? ? ? ? ?1
2? ? ? ? ?3? ? ? 56? ? ? ? ? ?yyy? ? ? ? ? 1.2? ? ? ? 2020? ? ? ?2001? ? ? 2020? ? ? ? ? ? ? ?1
3? ? ? ? ?4? ? ? 99? ? ? ? ? ?yyy? ? ? ? ? 5.0? ? ? ? 2001? ? ? ?2001? ? ? 2020? ? ? ? ? ? ? ?1
4? ? ? ? ?5? ? ? 99? ? ? ? ? ?xxx? ? ? ? ? 1.0? ? ? ? 2020? ? ? ?2012? ? ? 2020? ? ? ? ? ? ? ?1
5? ? ? ? ?6? ? ? 13? ? ? ? ? ?zzz? ? ? ? ? 3.2? ? ? ? 2015? ? ? ?2000? ? ? 2015? ? ? ? ? ? ? ?1
6? ? ? ? ?7? ? ? 12? ? ? ? ? ?zzz? ? ? ? ? 1.0? ? ? ? 2000? ? ? ?2000? ? ? 2015? ? ? ? ? ? ? ?1
7? ? ? ? ?8? ? ? 88? ? ? ? ? ?eee? ? ? ? ? 2.2? ? ? ? 2003? ? ? ?2001? ? ? 2020? ? ? ? ? ? ? ?0
8? ? ? ? ?9? ? ? 45? ? ? ? ? ?eee? ? ? ? ? 0.2? ? ? ? 2004? ? ? ?2001? ? ? 2020??

TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超5個(gè)贊
在一行中完成。
groupby()、transform布爾選擇并將結(jié)果轉(zhuǎn)換為integer.
df['nb_fave_rating']=df.groupby('restaurant_id')['star_rating'].transform(lambda x: int((x>=3).sum()))
rating_id user_id restaurant_id star_rating rating_year first_year \
0 1 56 xxx 2.3 2012 2012
1 2 13 xxx 3.7 2012 2012
2 3 56 yyy 1.2 2020 2001
3 4 99 yyy 5.0 2001 2001
4 5 99 xxx 1.0 2020 2012
5 6 13 zzz 3.2 2015 2000
6 7 12 zzz 1.0 2000 2000
7 8 88 eee 2.2 2003 2001
8 9 45 eee 0.2 2004 2001
last_year nb_fave_rating
0 2020 1.0
1 2020 1.0
2 2020 1.0
3 2020 1.0
4 2020 1.0
5 2015 1.0
6 2015 1.0
7 2020 0.0
8 2020 0.0

TA貢獻(xiàn)1830條經(jīng)驗(yàn) 獲得超9個(gè)贊
Grayrigel的解決方案(使用)是最快的解決方案。
map
用于獲取每個(gè)的
.groupby
評(píng)分計(jì)數(shù)>=3
restaurant_id
.merge
?positive_reviews
回到df
.
positive_reviews = df[df.star_rating >= 3.0 ].groupby('restaurant_id', as_index=False).agg({'star_rating': 'count'}).rename(columns={'star_rating': 'nb_fave_rating'})
# join back to df
df = df.merge(positive_reviews, how='left', on='restaurant_id').fillna(0)
# display(df)
? rating_id user_id restaurant_id? star_rating rating_year first_year last_year? nb_fave_rating
0? ? ? ? ?1? ? ? 56? ? ? ? ? ?xxx? ? ? ? ? 2.3? ? ? ? 2012? ? ? ?2012? ? ? 2020? ? ? ? ? ? ?1.0
1? ? ? ? ?2? ? ? 13? ? ? ? ? ?xxx? ? ? ? ? 3.7? ? ? ? 2012? ? ? ?2012? ? ? 2020? ? ? ? ? ? ?1.0
2? ? ? ? ?3? ? ? 56? ? ? ? ? ?yyy? ? ? ? ? 1.2? ? ? ? 2020? ? ? ?2001? ? ? 2020? ? ? ? ? ? ?1.0
3? ? ? ? ?4? ? ? 99? ? ? ? ? ?yyy? ? ? ? ? 5.0? ? ? ? 2001? ? ? ?2001? ? ? 2020? ? ? ? ? ? ?1.0
4? ? ? ? ?5? ? ? 99? ? ? ? ? ?xxx? ? ? ? ? 1.0? ? ? ? 2020? ? ? ?2012? ? ? 2020? ? ? ? ? ? ?1.0
5? ? ? ? ?6? ? ? 13? ? ? ? ? ?zzz? ? ? ? ? 3.2? ? ? ? 2015? ? ? ?2000? ? ? 2015? ? ? ? ? ? ?1.0
6? ? ? ? ?7? ? ? 12? ? ? ? ? ?zzz? ? ? ? ? 1.0? ? ? ? 2000? ? ? ?2000? ? ? 2015? ? ? ? ? ? ?1.0
7? ? ? ? ?8? ? ? 88? ? ? ? ? ?eee? ? ? ? ? 2.2? ? ? ? 2003? ? ? ?2001? ? ? 2020? ? ? ? ? ? ?0.0
8? ? ? ? ?9? ? ? 45? ? ? ? ? ?eee? ? ? ? ? 0.2? ? ? ? 2004? ? ? ?2001? ? ? 2020? ? ? ? ? ? ?0.0
%timeit比較
給定 9 行數(shù)據(jù)框,df在問(wèn)題中
# create a test dataframe of 1,125,000 rows
dfl = pd.concat([df] * 125000).reset_index(drop=True)
# test with transform
def add_rating_transform(df):
? ? return df.groupby('restaurant_id')['star_rating'].transform(lambda x: int((x>=3).sum()))
%timeit add_rating_transform(dfl)
[out]:
222 ms ± 9.01 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
# test with map
def add_rating_map(df):
? ? filtered_data = df[df['star_rating'] >= 3]
? ? d = filtered_data.groupby('restaurant_id')['star_rating'].count().to_dict()
? ? return df['restaurant_id'].map(d).fillna(0).astype(int)
%timeit add_rating_map(dfl)
[out]:
105 ms ± 1.56 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
# test with merge
def add_rating_merge(df):
? ? positive_reviews = df[df.star_rating >= 3.0 ].groupby('restaurant_id', as_index=False).agg({'star_rating': 'count'}).rename(columns={'star_rating': 'nb_fave_rating'})
? ? return df.merge(positive_reviews, how='left', on='restaurant_id').fillna(0)?
%timeit add_rating_merge(dfl)
[out]:
639 ms ± 26.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

TA貢獻(xiàn)1801條經(jīng)驗(yàn) 獲得超16個(gè)贊
統(tǒng)計(jì)評(píng)分 >= 3.0 的情況
df['nb_fave_rating'] = df.groupby('restaurant_id')['star_rating'].transform(lambda x: x.ge(3.0).sum()).astype(np.int)
添加回答
舉報(bào)