Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫:如何通过大于考虑索引来筛选列_Python_Pandas_Dataframe_Feature Engineering - Fatal编程技术网

Python 熊猫:如何通过大于考虑索引来筛选列

Python 熊猫:如何通过大于考虑索引来筛选列,python,pandas,dataframe,feature-engineering,Python,Pandas,Dataframe,Feature Engineering,我有一个数据框,代表餐馆的顾客评级star_rating是此数据框中客户的评级 我想做的是在同一个数据框中添加一个列“代码> nbfFaveEx等级< /代码>,它代表一个餐馆的总评论数量。< /强>我认为一个“有利的”意见,如果它的星星数是=3</Cult> data={'rating_id':[1','2','3','4','5','6','7','8','9'], ‘使用者识别码’:[‘56’、‘13’、‘56’、‘99’、‘99’、‘13’、‘12’、‘88’、‘45’], ‘餐厅

我有一个数据框,代表餐馆的顾客评级
star_rating
是此数据框中客户的评级

    我想做的是在同一个数据框中添加一个列“代码> nbfFaveEx等级< /代码>,它代表一个餐馆的总评论数量。< /强>我认为一个“有利的”意见,如果它的星星数是<代码>=3</Cult>
data={'rating_id':[1','2','3','4','5','6','7','8','9'],
‘使用者识别码’:[‘56’、‘13’、‘56’、‘99’、‘99’、‘13’、‘12’、‘88’、‘45’],
‘餐厅id’:[‘xxx’、‘xxx’、‘yyy’、‘xxx’、‘zzz’、‘zzz’、‘eee’、‘eee’],
‘星级’:[‘2.3’、‘3.7’、‘1.2’、‘5.0’、‘1.0’、‘3.2’、‘1.0’、‘2.2’、‘0.2’],
‘评级年’:[‘2012’、‘2012’、‘2020’、‘2001’、‘2020’、‘2015’、‘2000’、‘2003’、‘2004’],
‘第一年’:[‘2012’、‘2012’、‘2001’、‘2012’、‘2000’、‘2000’、‘2001’、‘2001’],
‘最后一年’:[‘2020’、‘2020’、‘2020’、‘2020’、‘2020’、‘2015’、‘2015’、‘2020’、‘2020’],
}
df=pd.DataFrame(数据,列=['rating_id'、'user_id'、'restaurant_id'、'star_rating'、'rating_year'、'first_year'、'last_year')
df[“星级”]=df[“星级”].aType(浮动)
正面评论=df[df.star\u rating>=3.0].groupby('restaurant\u id'))
正面评论。head()
从这里开始,我不知道如何计算一家餐厅的正面评价数量,并将其添加到我的初始数据框
df
的新列中

预期的输出是这样的

data = {'rating_id': ['1', '2','3','4','5','6','7','8','9'],
        'user_id': ['56', '13','56','99','99','13','12','88','45'],
        'restaurant_id':  ['xxx', 'xxx','yyy','yyy','xxx','zzz','zzz','eee','eee'],
        'star_rating': ['2.3', '3.7','1.2','5.0','1.0','3.2','1.0','2.2','0.2'],
        'rating_year': ['2012','2012','2020','2001','2020','2015','2000','2003','2004'],
        'first_year': ['2012', '2012','2001','2001','2012','2000','2000','2001','2001'],
        'last_year': ['2020', '2020','2020','2020','2020','2015','2015','2020','2020'],
        'nb_fave_rating': ['1', '1','1','1','1','1','1','0','0'],
        }
所以我试了一下,吃了一堆“南”

df['nb\u fave\u rating']=df[df.star\u rating>=3.0].groupby('restaurant\u id').agg({'star\u rating':'count'))
df.head()
一行完成

groupby()
转换
布尔选择并将结果转换为
整数

  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  
  • 使用
    映射的from是最快的解决方案
  • 使用
    .groupby
    获取每个
    餐厅id的评分计数
    =3
  • .merge
    正面评论
    返回到
    df
positive\u reviews=df[df.star\u rating>=3.0]。groupby('restaurant\u id',as\u index=False)。agg({'star\u rating':'count'})。重命名(列={'star\u rating':'nb\u fave\u rating'})
#返回df
df=df.merge(正面评论,how='left',on='restaurant'u id')。fillna(0)
#显示(df)
评级\u id用户\u id餐厅\u id明星\u评级\u年第一年\u年去年\u年nb\u fave\u评级
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
7888 eee 2.2 2003 2001 2020 0.0
8 9 45 eee 0.2 2004 2001 2020 0.0
%timeit
比较
  • 给定9行数据帧,
    df
#创建1125000行的测试数据帧
dfl=pd.concat([df]*125000)。重置索引(drop=True)
#变换测试
def添加分级转换(df):
返回df.groupby('restaurant_id')['star_rating'].transform(lambda x:int((x>=3.sum()))
%timeit添加分级转换(dfl)
[out]:
每个回路222 ms±9.01 ms(7次运行的平均值±标准偏差,每个回路1次)
#地图测试
def添加等级图(df):
过滤数据=df[df[‘星级’]>=3]
d=过滤的数据。groupby('restaurant_id')['star_rating'].count()。to_dict()
返回df['restaurant_id'].map(d).fillna(0).astype(int)
%timeit添加分级图(dfl)
[out]:
每个回路105 ms±1.56 ms(7次运行的平均值±标准偏差,每个10个回路)
#合并测试
def添加\评级\合并(df):
正面评论=df[df.star\u rating>=3.0]。groupby('restaurant\u id',as\u index=False)。agg({'star\u rating':'count'})。重命名(列={'star\u rating':'nb\u fave\u rating'})
返回df.merge(正面评论,how='left',on='restaurant'u id')。fillna(0)
%timeit添加\评级\合并(dfl)
[out]:
每个回路639 ms±26.5 ms(7次运行的平均值±标准偏差,每个回路1次)

以下是一个具有和的潜在解决方案:

输出

  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               0

计算评级>=3.0的情况

df['nb_fave_rating'] = df.groupby('restaurant_id')['star_rating'].transform(lambda x: x.ge(3.0).sum()).astype(np.int)

伟大的分析@Trenton。谢谢分享。从你的答案中总有很多东西要学。
df['nb_fave_rating'] = df.groupby('restaurant_id')['star_rating'].transform(lambda x: x.ge(3.0).sum()).astype(np.int)