2017-12-21 39 views
-2

:両方もののPython Pandas:Groupbyなぜ1つのシンタックスしか機能しないのですか?以下の場合

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

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.groupby('a').b.nth(-1) 

    b 
a  
1 21 
2 30 
3 41 

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

- 
    b 
a  
1 21 
2 30 
3 41 

非常に似通った結果を返します。

は(参照:https://stackoverflow.com/a/47924467/7450524

+0

これを試してください: 'type(df.groupby( 'a').b.nth(-1))'と 'type(df.groupby( 'a')。nth(-1))' 他の1つはデータフレームを返します。 –

+0

シリーズマッピングは別のシリーズでのみ動作することをご存知でしょうか。 – Dark

+0

'df.groupby( 'a').b.nth(-1)'はあなたの言うことを返しません。 – Goyo

答えて

3

私の答えがなぜ機能するのか理解したい場合は、これが理由です。

検討 -

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

    b 
a  
1 21 
2 30 
3 41 
nth

はデータフレームで、その結果、各列の各グループのに適用されます。あなたの場合、列は1つだけです。

ただし、この場合には -

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

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

のみbに適用されるので、結果は一連です。今

、あなたがそれに渡すことができるか、具体的には、mapのためのドキュメントを見てみましょう -

arg:機能、辞書、またはシリーズ

呼び出し可能な、dict、またはpd.Seriesオブジェクトです。データフレームを渡すことはできません!何ですかmapは、mapを呼び出すシリーズのインデクサーとしてシリーズのインデックスを使用しており、それに対応するの値をインデックスに置き換えます。

0

違いがあります - 列を指定しない場合、それはDataFrameを返す:

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

そしてSeriesを返す指定すると:

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

エラーがで作業mapを意味しますSeriesDataFrameではなく、オンです1つの列df

関連する問題