Добавить рейтинг столбца на основе условий и уникальных значений - PullRequest
0 голосов
/ 16 октября 2019

Я хотел бы добавить рейтинговый столбец на основе 3 условий: название компании, бренд, год.

Это мои необработанные данные:

  CompanyName        Brand  Year
0           A        Razer  2019
1           A  SteelSeries  2019
2           A     Logitech  2019
3           A        Razer  2018
4           A  SteelSeries  2018
5           B     Logitech  2019
6           B         Asus  2019
7           B         Benq  2018
8           C         Asus  2017
9           C        Razer  2017

Это мой желаемый результат :(Может быть, это сбивает с толку)

  CompanyName        Brand  Year  Rank
0           A        Razer  2019     1
1           A  SteelSeries  2019     2
2           A     Logitech  2019     3
3           A        Razer  2018     1
4           A  SteelSeries  2018     2
5           B     Logitech  2019     1
6           B         Asus  2019     2
7           B         Benq  2018     1
8           C         Asus  2017     1
9           C        Razer  2017     2

Код, который я пробовал, но он только зацикливает уникальность Марка:

df1 = pd.DataFrame()
for i,brands in enumerate(df['Brand'].unique):
     df1.loc[i-1,'Rank'] = i
     df1.loc[i-1, 'Brand']= brands

df = df.merge(df1,on='Brand',how='inner')

Ответы [ 2 ]

0 голосов
/ 16 октября 2019

Я могу предложить два способа решения проблемы:

import pandas as pd


def calculate_rank(name, brand, year):
    """My mock way to calculate rank based on the three columns"""
    rank = 0
    if year == 2019:
        rank += 1
    else:
        pass
    rank += len(name)
    rank += len(brand)
    return rank


if __name__ == "__main__":

    x = pd.DataFrame({
        "Name": ["A", "AB", "AC", "D"],
        "Brand": ["AAAA", "DDDDD", "BB", "Y"],
        "Year": [2019, 2018, 2019, 2018]})

    # Pandas official way to do it:
    x["Rank"] = x.apply(lambda row: calculate_rank(row["Name"], row["Brand"], row["Year"]), axis=1)
    print(x)

    # Another not pandas way below, use the first one!

    y = pd.DataFrame({
        "Name": ["A", "AB", "AC", "D"],
        "Brand": ["AAAA", "DDDDD", "BB", "Y"],
        "Year": [2019, 2018, 2019, 2018]})
    y["Rank"] = None
    for i in range(len(y)):
        print(len(y))
        y["Rank"][i] = calculate_rank(y["Name"][i], y["Brand"][i], y["Year"][i])
    print(y)

Дайте мне знать, если это помогло!

0 голосов
/ 16 октября 2019

в следующий раз предоставьте текстовый фрейм данных в следующем формате -

, пожалуйста, просмотрите Как сделать хорошие воспроизводимые примеры панд

 CompanyName        Brand  Year
0           A        Razer  2019
1           A  SteelSeries  2019
2           A     Logitech  2019
3           A        Razer  2018
4           A  SteelSeries  2018
5           B     Logitech  2019
6           B         Asus  2019
7           B         Benq  2018
8           C         Asus  2017
9           C        Razer  2017

довольно просто, вы можетесгруппируйте по столбцам CompanyName и Year и примените кумулятивный счет:

df['Rank'] = df.groupby(['CompanyName','Year']).cumcount()+1
print(df)
      CompanyName        Brand  Year  Rank
0           A        Razer  2019     1
1           A  SteelSeries  2019     2
2           A     Logitech  2019     3
3           A        Razer  2018     1
4           A  SteelSeries  2018     2
5           B     Logitech  2019     1
6           B         Asus  2019     2
7           B         Benq  2018     1
8           C         Asus  2017     1
9           C        Razer  2017     2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...