Ошибка в манипулировании файловой рамкой внутри функции (объект «функция» не имеет атрибута)

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

Исходный фреймворк:

      Team  Rank  Year  Points
0   Riders     1  2014     876
1   Riders     2  2015     789
2   Devils     2  2014     863
3   Devils     3  2015     673
4    Kings     3  2014     741
5    kings     4  2015     812
6    Kings     1  2016     756
7    Kings     1  2017     788
8   Riders     2  2016     694
9   Royals     4  2014     701
10  Royals     1  2015     804
11  Riders     2  2017     690

И идеальным является:

      Team  Rank  Year  Points  year code
0   Riders     1  2014     876          0
1   Devils     2  2014     863          0
2    Kings     3  2014     741          0
3   Royals     4  2014     701          0
4   Riders     2  2015     789          1
5   Devils     3  2015     673          1
6    kings     4  2015     812          1
7   Royals     1  2015     804          1
8    Kings     1  2016     756          2
9   Riders     2  2016     694          2
10   Kings     1  2017     788          3
11  Riders     2  2017     690          3

И я определил функцию, которая поможет мне в этом:

def gen_countrycode(df):
grouped = df.groupby('Country Name')
Countries=df['Country Name'].unique()
group_num=range(len(df.groupby(['Country Name']).groups))
newdf=pd.DataFrame()
for i in group_num:
    country=Countries[i]
    country_group=grouped.get_group(country)
    country_group['country code']=i
    newdf=pd.concat([newdf,country_group], ignore_index=True)
return newdf

Часть определения работает нормально, но когда я применяю ее к своей области данных, происходит ошибка:

line 2, in gen_countrycode
grouped = df.groupby('Country Name')
AttributeError: **'function' object has no attribute 'groupby'**

Не знаю, почему нельзя манипулировать файловой рамкой внутри функции. Кстати, если есть лучший способ создать такой «групповой код», спасибо за вдохновение!

Всего 1 ответ


Используйте groupby.ngroup :

df1 = df.sort_values('Year')
df1['year code'] = df1.groupby('Year').ngroup()
df1 = df1.reset_index(drop=True)

# df.sort_values('Year').assign(Code=df.groupby('Year').ngroup()).reset_index(drop=True)

    Team  Rank  Year   Points year code
0   Riders  1   2014    876      0
1   Devils  2   2014    863      0
2   Kings   3   2014    741      0
3   Royals  4   2014    701      0
4   Riders  2   2015    789      1
5   Devils  3   2015    673      1
6   kings   4   2015    812      1
7   Royals  1   2015    804      1
8   Kings   1   2016    756      2
9   Riders  2   2016    694      2
10  Kings   1   2017    788      3
11  Riders  2   2017    690      3

Есть идеи?

10000