2016-05-10 5 views
7

最初に私がpandasを初めて使ったとしましょう。Python pandas:メソッド連鎖を使用してグループ化されたDataFrameに列を追加します

DataFrameに新しい列を作成しようとしています。私は私の例に示すようにこれを行うことができます。しかし、私はメソッドを連鎖させることでこれをしたいので、新しい変数を割り当てる必要はありません。

In [1]: 
import numpy as np 
from pandas import Series,DataFrame 
import pandas as pd 

In [2]: 
np.random.seed(10) 
df=pd.DataFrame(np.random.randint(1,5,size=(10, 3)), columns=list('ABC')) 
df 

Out [2]: 
A B C 
2 2 1 
4 1 2 
4 1 2 
2 1 2 
2 3 1 
2 1 3 
1 3 1 
4 1 1 
4 4 3 
1 4 3 
In [3]: 
filtered_DF = df[df['B']<2].copy() 
grouped_DF = filtered_DF.groupby('A') 
filtered_DF['C_Share_By_Group'] =filtered_DF.C.div(grouped_DF.C.transform("sum")) 
filtered_DF 

Out [3]: 
A B C C_Share_By_Group 
4 1 2    0.4 
4 1 2    0.4 
2 1 2    0.4 
2 1 3    0.6 
4 1 1    0.2 

私が連鎖する方法で同じことを達成したい:私は最初に私が達成したいかを示す、と私は今のところこれを実行してみましょう。 dplyrパッケージとRで、私のような何かを行うことができるだろう:それはRでmutate(dplyr)はパンダでassignに等しいことを言うpandas documentation

df %>% 
    filter(B<2) %>% 
    group_by(A) %>% 
    mutate('C_Share_By_Group'=C/sum(C)) 

を、しかしassignがグループ化された上では動作しません。オブジェクト。 私はデータフレームをグループ化するために何かを割り当てるしようとすると、私はエラーを取得:

"AttributeError: Cannot access callable attribute 'assign' of 'DataFrameGroupBy' objects, try using the 'apply' method"

私は次のことを試してみましたが、新しい列を追加する方法を知っている、またはこれを達成することも可能である場合はありませんメソッドの連鎖によって:

(df.loc[df.B<2] 
    .groupby('A') 
    #****WHAT GOES HERE?**** apply(something)? 
) 
+0

機能からの命令型プログラミングに悲しい世界へようこそ。 Pythonでtransformを使うことができます –

答えて

7

をあなたはassignを試すことができます。

print df[df['B']<2].assign(C_Share_By_Group=lambda df: 
         df.C 
         .div(df.groupby('A') 
          .C 
          .transform("sum"))) 

    A B C C_Share_By_Group 
1 4 1 2    0.4 
2 4 1 2    0.4 
3 2 1 2    0.4 
5 2 1 3    0.6 
7 4 1 1    0.2 
+0

ありがとうございます。私はこれが本当に私が探していた答えだとは思わない。メソッド連鎖の美しさの1つは、メソッドの出力を渡すときに、2回する必要がないということです。 あなたのアプローチでは、同じDataFrameを3回フィルタリングしています( 'df ['B'] <2]')。 – LauH

+0

ありがとうございます。あなたは正しいので、回答は編集され、不要なコードは削除されました。今すぐ確認してください。 – jezrael

+0

私はあなたのコードを実行しようとしましたが、結果は私のコードと等しくありません。 C_Share_By_Group 0.250000 0.250000 0.285714 0.428571 0.125000 – LauH

関連する問題