有关:
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
确实提供了非常相似的结果。
答案 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
可调用的dict
或pd.Series
对象。你无法传递数据帧! map
的作用是,它使用系列索引作为您调用map
的系列的索引器,并将 索引的相应值替换为1>}。 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
。