python - 在 pandas 数据框中组合 groupby 后创建共享变量

标签 python python-3.x pandas dataframe pandas-groupby

我无法描述我的问题,所以我会直接进入。下面是一些测试数据:

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/

相关文章:

pandas - 将数据框添加到特定行和列的现有数据框

python - Pandas 将字符串列和 NaN( float )转换为整数,并保留 NaN

python - 将格式为 YYYYMM 且类型为 'pandas.core.indexes.base.Index' 的数据帧索引转换为日期时间索引

python - PyQt/PySide 中是否有默认图标?

python - 矩阵A乘以多维矩阵 "matrix-wise?"

python-3.x - Pandas 按两列分组,并获取按降序排序的其中一列的每个值的前 n 行

django - 使用 python 3 用 django 创建 PDF

python - 使用 Python 的日志记录模块记录错误的问题

python - 使用 else 子句进行过滤 (numpy.where)

python - Multiindex 中的 Pandas 自定义排序行