首页 > 解决方案 > 在函数内操作数据框时出错(“函数”对象没有属性)

问题描述

我想添加一个列,它是某个列中唯一值的索引。

原始数据框是:

      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'**

不知道为什么不能在函数中操作数据框。顺便说一句,如果有更好的方法来生成这样的“组码”,谢谢你的启发!

标签: pythonpandasfunctiondataframegroup-by

解决方案


使用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

推荐阅读