我无法描述我的问题,所以我会直接进入。下面是一些测试数据:
import pandas as pd
df = pd.DataFrame(data={"family":["Smith","Miller","Simpson","Miller","Simpson","Smith","Miller","Simpson","Miller"],
"first_name":["Anna","Bart","Lisa","Ida","Paul","Bridget","Harry","Dustin","George"],
"shirt_color":["green","yellow","red","yellow","green","red","yellow","red","red"]})
现在我想在我的原始数据框中创建一个新列,其中包含每个家庭的 shirt_color 份额,因此每一行都包含例如family Miller 和 shirt_color yellow 具有相同的值 0.75 等。
我尝试了几种方法,但没有任何一种成功。
df = df.groupby("family").apply(lambda x: x.groupby("shirt_color").apply(lambda x: x.size()/familysize))
这看起来很有希望,但如您所见,我无法再访问最后一个 lambda 函数中的家庭成员数量。我还尝试创建一个只有 family 的 groupby 对象并遍历数据帧,将所有数据帧单独按颜色分组,但不知何故我最终无法将数据帧放回一个。
对于数据框来说,这似乎不是一件非常奇特的事情,所以我确信有一种简单的方法可以做到这一点,但我没有主意。
非常感谢您的提前帮助!
最佳答案
在我看来,您应该避免使用 apply
,因为这会导致效率低下的 Python 级循环。这是使用 GroupBy
+ transform
的替代解决方案:
f = df.groupby('family')['first_name'].transform('size')
g = df.groupby(['family', 'shirt_color'])['first_name'].transform('size')
df['ratio'] = g / f
print(df)
family first_name shirt_color ratio
0 Smith Anna green 0.500000
1 Miller Bart yellow 0.750000
2 Simpson Lisa red 0.666667
3 Miller Ida yellow 0.750000
4 Simpson Paul green 0.333333
5 Smith Bridget red 0.500000
6 Miller Harry yellow 0.750000
7 Simpson Dustin red 0.666667
8 Miller George red 0.250000
关于python - 在 pandas 数据框中组合 groupby 后创建共享变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52820596/