操作函数中的数据框时出错(“函数”对象没有属性)

时间:2018-10-17 17:40:46

标签: python pandas function dataframe group-by

我想添加一列,该列是特定列中唯一值的索引。

原始数据框为:

service

理想的是:

      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

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

1 个答案:

答案 0 :(得分: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