TypeError:使用pd.Series.map时,'DataFrame'对象不可调用

时间:2017-12-21 15:16:30

标签: python pandas group-by pandas-groupby

有关:

die();

为什么只有这个

df = pd.DataFrame({'a': (1,1,2,3,3), 'b':(20,21,30,40,41)})

但不是:

df['b_new'] = df.a.map(df.groupby('a').b.nth(-1))

虽然两者:

>>df['b_new'] = df.a.map(df.groupby('a').nth(-1))
...
TypeError: 'DataFrame' object is not callable

>>df.groupby('a').b.nth(-1)

    b
a    
1  21
2  30
3  41

确实提供了非常相似的结果。

(另见:https://stackoverflow.com/a/47924467/7450524

2 个答案:

答案 0 :(得分:3)

如果你想理解为什么我的答案有效,那么这就是原因。

考虑 -

df.groupby('a').nth(-1)

    b
a    
1  21
2  30
3  41

nth应用于每个组的每列,从而生成数据帧。在您的情况下,只有一列。

然而,在这种情况下 -

df.groupby('a').b.nth(-1)

a
1    21
2    30
3    41
Name: b, dtype: int64

nth 应用于b,因此结果是一系列。

现在,看一下map的文档,特别是你可以传递给它的文档 -

  

arg:function,dict或Series

可调用的dictpd.Series对象。你无法传递数据帧! map的作用是,它使用系列索引作为您调用map的系列的索引器,并将 索引的相应值替换为}。 p>

答案 1 :(得分:1)

存在差异 - 如果不指定列,则返回DataFrame

print (df.groupby('a').nth(-1))
    b
a    
1  21
2  30
3  41

并指定return Series

print (df.groupby('a').b.nth(-1))
a
1    21
2    30
3    41
Name: b, dtype: int64

错误表示map使用Series,而不是DataFrame,但它只有一列df