Python pandas:使用方法链接将列添加到分组的DataFrame

Lau*_*auH 8 python dataframe python-2.7 pandas

首先让我说我是熊猫新手.

我想在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
Run Code Online (Sandbox Code Playgroud)

我希望通过链接方法来实现同样的目的.在R with dplyr包中,我可以做类似的事情:

df %>% 
  filter(B<2) %>%
  group_by(A) %>% 
  mutate('C_Share_By_Group'=C/sum(C))
Run Code Online (Sandbox Code Playgroud)

pandas文档中,它表示mutate在R(dplyr)中等于assignpandas,但assign不适用于分组对象.当我尝试将某些内容分配给分组数据帧时,出现错误:

"AttributeError:无法访问'DataFrameGroupBy'对象的可调用属性'assign',请尝试使用'apply'方法"

我尝试了以下内容,但不知道如何添加新列,或者甚至可以通过链接方法实现此目的:

(df.loc[df.B<2]
   .groupby('A')
    #****WHAT GOES HERE?**** apply(something)?
)
Run Code Online (Sandbox Code Playgroud)

jez*_*ael 8

你可以尝试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
Run Code Online (Sandbox Code Playgroud)