最初に私が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)?
)
機能からの命令型プログラミングに悲しい世界へようこそ。 Pythonでtransformを使うことができます –