根据python pandas中其他列的计算平均值更改列值

时间:2020-06-19 13:36:21

标签: python-3.x pandas dataframe

我是熊猫的新手。我经历了很多问题,但没有找到答案。

我有以下数据集。

Name    || Price    || Cuisine Category || City || Region || Cuisine Types || Rating Types || Rating

Pizza  || 600  || Fast Food,Pizza || Ajmer ||   Ana Saga || Quick Bites || Good || 3.9

...     ...     ...     ...     ...     ...     ...     ...     ...

Chawla's || 300 || Beverages || Ajmer || Sagar Lake     || Cafe || Average || 3.3

Masala || 0 || North,South Indian || Ajmer || Ram Ganj || Mess || None || NEW

我想更改以下值:

  • 根据特定菜式的平均评分,然后根据计算出的评分计算评分类型,对评分进行新的评分

  • 价格(该价格为0,基于该特定区域的平均价格)

我尝试更改价格:

读取CSV文件

data = pd.read_csv('/content/Ajmer.csv')

计算价格的区域明智平均值

gregion = round(data.groupby('Region')['Price'].mean()) 

试图替换价格栏的0

data['Price'] = data['Price'].replace(0, gregion[data['Region']])

但是我的价格栏保持不变。

我尝试更改评分:

读取CSV文件

data2 = pd.read_csv('/content/Ajmer.csv')

创建单独的数据框,以免影响平均值。

filtered_rating = data2[(data2['Rating'] == 'NEW') | (data2['Rating'] == '-') | (data2['Rating'] == 'Opening')]

从原始数据中删除2

data2.drop(data2.loc[data['Rating']=='NEW'].index, inplace=True)
data2.drop(data2.loc[data['Rating']=='-'].index, inplace=True)
data2.drop(data2.loc[data['Rating']=='Opening'].index, inplace=True)

计算美食类型的评分平均值

c = round(data2.groupby('Cuisine Types')['Rating'].mean(),1)

这给了我以下输出:

Cuisine Types

Bakery            3.4

Confectionery     3.4

Dessert Parlor    3.5

...

Quick Bites       3.4

Sweet Shop        3.4

Name: Rating, dtype: float64

尝试替换值

filtered_rating['Rating'].replace('NEW', c[data2['Region']], inplace=True)
filtered_rating['Rating'].replace('-', c[data2['Region']], inplace=True)
filtered_rating['Rating'].replace('Opening', c[data2['Region']], inplace=True)

但是我的“评级”列未更改。

预期产量

  • “价格”列中价格为零的特定行区域的平均价格

  • “等级”列中等级为“新”的特定美食类型的平均等级

有人可以帮我吗?

预先感谢! 我会很高兴您的帮助

2 个答案:

答案 0 :(得分:1)

让我们说您有如下数据。

Webpacker.manifest.lookup('calendar.js') # => "/packs/calendar-1016838bab065ae1e122.js"

现在,根据您的问题,我们需要将等级为“新”或“开头”时,分别替换为“ coachine_type”的平均等级。并且其各自的平均价格为0时的价格。并最后将评级类型更新为“无”。

data
    name            region     price    cuisine_type          rating_type   rating
0   pizza           NY          500      fast food              average        3.3
1   burger          NY          350      fast food              good           4.1
2   lobster         LA          1500     seafood                good           4.5
3   mussels         LA          1000     seafood                average        3.9
4   shawarma        NY          300    mediterranean            average        3.4
5   kabab           LA          600    mediterranean            good             4
6   pancake         NY          250      breakfast              average        3.7
7   waffle          LA          450      breakfast              good           4.2
8   fries           NY          0        fast food              None           NEW
9   crab            LA          0        seafood                None        Opening
10  tuna sandwich   NY          0        seafood                None           NEW
11  onion rings     LA          0        fast food              None        Opening
#get a list of cuisine types
cuisine_type_list=data.cuisine_type.unique().tolist()

cuisine_type_list
['fast food', 'seafood', 'mediterranean', 'breakfast']

#get a list of regions
region_list=data.region.unique().tolist()

region_list
['NY', 'LA']

这是更新后的数据

#replace the ratings 
for i in cuisine_type_list:
  data.loc[(data.cuisine_type==i) & (data.rating.isin(['NEW', 'Opening'])), 'rating']=round(data.loc[(data.cuisine_type==i) & (data.rating.isin(['NEW', 'Opening'])==False)].rating.mean(), 2)

#replace price when 0
for i in region_list:
  data.loc[(data.region==i) & (data.price==0), 'price']=round(data.loc[(data.region==i) & (data.price!=0)].price.mean(), 2)


#function to assign rating type (assuming good for rating>=4)
def calculate_rating_type(row):
  if row['rating'] >= 4:
    return 'good'
  else: 
    return 'average'

#update rating type
data.loc[data.rating_type.isnull(), 'rating_type']=data.loc[data.rating_type.isnull()].apply(lambda row: calculate_rating_type(row), axis=1)

答案 1 :(得分:0)

您可以尝试以下代码:

gregion = round(data.groupby('Region')['Price'].mean()) 
# convert your group by to DataFrame
gregion = pd.DataFrame(gregion)
gregion.reset_index(inplace=True)

# merge the datas and drop the new column that is created
data = data.merge(gregion, left_on='Region', right_on='Region', suffixes=('_x', ''))
data = data.drop(columns={'Price_x'})

filtered_rating = data[(data['Rating'] == 'NEW') | (data['Rating'] == '-') | (data['Rating'] == 'Opening')]

# you don't need to re-upload the file
data2 = data.copy()

data2.drop(data2.loc[data2['Rating']=='NEW'].index, inplace=True)
data2.drop(data2.loc[data2['Rating']=='-'].index, inplace=True)
data2.drop(data2.loc[data['Rating']=='Opening'].index, inplace=True)

# do the same with c
c = round(data2.groupby('Cuisine Types')['Rating'].mean(),1)
c = pd.DataFrame(c)
c.reset_index(inplace=True)

filtered_rating = filtered_rating.merge(c, left_on='Cuisine Types', right_on='Cuisine Types', how='left', suffixes=('_x', ''))
filtered_rating = filtered_rating.drop(columns={'Rating_x'})

希望这会有所帮助。