首页 > 编程问答 >有没有办法根据 Pandas GroupBy 的计数在 2 个数据帧之间重复分配值?

有没有办法根据 Pandas GroupBy 的计数在 2 个数据帧之间重复分配值?

时间:2024-07-31 08:16:48浏览次数:12  
标签:python pandas group-by

我有两个结构相同但形状和值不同的 Pandas 数据框:

import pandas as pd

dataframe_1 = pd.DataFrame({'customer_id': ['id1', 'id2', 'id3', 'id4', 'id5', 'id6'], 
                        'gender': ['M', 'M', 'F', 'F', 'F', 'F'],
                        'age': ['18-25', '25-40', '18-25', '18-25', '60+', '18-25'],
                        'region': ['America', 'Africa', 'America', 'Asia', 'Europe', 'Asia']})

dataframe_2 = pd.DataFrame({'customer_id': ['id11', 'id12', 'id13', 'id14', 'id15', 'id16', 'id17', 'id18', 'id19', 'id20', 'id21'], 
                        'gender': ['M', 'M', 'F', 'F', 'F', 'M', 'M', 'M', 'F', 'M', 'F'],
                        'age': ['18-25', '25-40', '18-25', '18-25', '60+', '18-25', '25-40', '60+', '18-25', '60+', '18-25'],
                        'region': ['America', 'Africa', 'America', 'Asia', 'Europe', 'Europe', 'Africa', 'Australia', 'Asia', 'Europe', 'Asia']})

我在 dataframe_1 上执行了 GroupBy 来计算每个组中的客户数量,并以数据框的形式获得了分布:

pd.DataFrame(dataframe_1.groupby(['gender', 'age', 'region'])['customer_id'].count()).reset_index

它的输出:

    gender  age     region  customer_id
0   F       18-25   America 1
1   F       18-25   Asia    2
2   F       60+     Europe  1
3   M       18-25   America 1
4   M       25-40   Africa  1

有没有办法将这种分布强加在 dataframe_2 上以获得具有匹配参数的不同 customer_ids?

因此,在第 0 行(['F', '18-25', 'America'])的情况下,它将是 datframe_2, id13 的唯一选项。

如果是第 1 行 (['F', '18-25', 'Asia']),它将是 [id_14, id_19, id_21]等


当然可以!你可以使用以下步骤,根据 dataframe_1 中组的大小,从 dataframe_2 中采样获得期望的结果:

import pandas as pd

dataframe_1 = pd.DataFrame({'customer_id': ['id1', 'id2', 'id3', 'id4', 'id5', 'id6'], 
                        'gender': ['M', 'M', 'F', 'F', 'F', 'F'],
                        'age': ['18-25', '25-40', '18-25', '18-25', '60+', '18-25'],
                        'region': ['America', 'Africa', 'America', 'Asia', 'Europe', 'Asia']})

dataframe_2 = pd.DataFrame({'customer_id': ['id11', 'id12', 'id13', 'id14', 'id15', 'id16', 'id17', 'id18', 'id19', 'id20', 'id21'], 
                        'gender': ['M', 'M', 'F', 'F', 'F', 'M', 'M', 'M', 'F', 'M', 'F'],
                        'age': ['18-25', '25-40', '18-25', '18-25', '60+', '18-25', '25-40', '60+', '18-25', '60+', '18-25'],
                        'region': ['America', 'Africa', 'America', 'Asia', 'Europe', 'Europe', 'Africa', 'Australia', 'Asia', 'Europe', 'Asia']})

# 计算 dataframe_1 中每个组的大小
group_counts = dataframe_1.groupby(['gender', 'age', 'region'])['customer_id'].count()

# 创建一个空列表来存储结果
sampled_data = []

# 循环遍历 dataframe_1 中的每个组
for (gender, age, region), count in group_counts.items():
    # 从 dataframe_2 中的相应组中采样 customer_id
    sampled_ids = dataframe_2[
        (dataframe_2['gender'] == gender) & 
        (dataframe_2['age'] == age) & 
        (dataframe_2['region'] == region)
    ]['customer_id'].sample(count, replace=True).tolist()
    # 将采样到的数据追加到结果列表中
    sampled_data.extend(
        [{'gender': gender, 'age': age, 'region': region, 'customer_id': customer_id} for customer_id in sampled_ids]
    )

# 创建一个新的 dataframe 来存储采样结果
sampled_df = pd.DataFrame(sampled_data)

print(sampled_df)

这段代码首先根据 'gender', 'age' 和 'region' 列对 dataframe_1 进行分组,并计算每个组的大小。然后,它循环遍历每个组,并使用 sample() 方法从 dataframe_2 中的相应组中随机选择指定数量的 'customer_id'。最后,它将采样结果存储在一个新的 dataframe 中。

这将给你一个新的 dataframe,其中包含来自 dataframe_2 的 'customer_id',这些 'customer_id' 按照 dataframe_1 中定义的分布进行分组。请注意,由于使用了采样,因此每次运行代码时,结果可能会有所不同。

可选参数:

  • replace=True : 此参数允许从 dataframe_2 中重复采样 'customer_id'。这在组大小大于 dataframe_2 中相应组的大小时非常有用。如果希望避免重复采样,请将此参数设置为 False
  • random_state : 此参数可以用来设置随机数生成器的种子,以确保每次运行代码时都能获得相同的采样结果。

标签:python,pandas,group-by
From: 78812830

相关文章

  • 如何在 pandas 中设置列​​标题的样式?
    假设我有一个带有列标题“A”和“B”的2x2DataFrame:importpandasaspddata_style=[['background-color:#fdfd96',''],['','background-color:#fdfd96']]df=pd.DataFrame([[1,2],[3,4]],columns=["A",&qu......
  • 如何在for循环中使用curve_fit函数在python中一次性创建多个回归?
    简而言之,我有两个矩阵,一个称为t,另一个称为y。每个都有7列。假设它们被称为a、b、c、d、e、f和g。我想要的是从a对a、b对b、...、g对g这两个矩阵进行回归。我已经设法使我的算法使用curve_fit对一列进行回归一次。但我真正希望的是它能够一次性完成7个回归......
  • 激活虚拟环境会让python消失?
    VisualStudioCode终端的屏幕截图如屏幕截图所示,python在Powershell中运行得很好。然后我在E:\DrewFTCAPI\ftcapivenv激活虚拟环境,然后python就消失了。不仅没有消失,它不运行任何东西,也不产生任何输出。我至少预计会出现某种类型的"python"i......
  • Python 3.6 中的相互递归类型,使用命名元组语法
    我正在尝试实现图的节点和边。这是我的代码:fromtypingimportNamedTuple,ListclassNode(NamedTuple):name:stredges:List[Edge]classEdge(NamedTuple):src:Nodedest:Node这会引发错误,因为创建Edge时未定义Node类型。......
  • 使用 keras 模型对函数进行 Python 类型提示
    如果我创建这样的函数:defmdl(input_shape):model=Sequential()model.add(Conv2D(depth=64,kernel_size=(3,3),input_shape=input_shape,activation='relu'))model.add(Dense(32),activation='relu')model.add(Dropout(0.3))m......
  • Python:自动完成可以用于列表中的元素吗?
    Python在函数参数和函数返回类型中具有类型提示。类的元素是否有类似的东西?我希望能够在如下示例中使用自动完成功能:classMyClass:defhello(self):print("Hello")mylist=[]mylist.append(MyClass())foriinmylist:i.hello()#Noautocomplete......
  • python 中 COM 对象的正确类型提示是什么?
    我在python中使用COM对象来向3rd方软件公开可编程接口。这是通过使用Dispatchfromwin32com.client来实现的。我的项目也一直在使用python.3.7中的类型提示,但是我不确定如何为了类型提示的目的定义这些COM对象的类型。这个问题涉及我拥有的所有COM......
  • 如何遍历Python字典同时避免KeyErrors?
    解析大型JSON时,某些键可能仅在某些情况下存在,例如出现错误时。从服务器的API获取200OK的情况并不少见,但是您得到的响应包含应检查的错误。处理此问题的最佳方法是什么?我知道使用类似||之类的东西。|是处理KeyError的一种方法。get()但是如果......
  • Python 中的递归数据类型
    Python中最接近Haskell中的递归数据类型的是什么?(即在定义自身时使用类型自己的定义。)编辑:为了给出递归类型的更具体定义,下面是Haskell中的二叉树:dataTreea=Leafa|Branch(Treea)(Treea)我的阅读方式如下:二叉树可以是叶子,也可以包含两......
  • 如何在Python中平滑相邻的多边形?
    我正在寻找一种平滑多边形的方法,以便相邻/接触的多边形保持接触。单个多边形可以轻松平滑,例如使用PAEK或Bezier插值(https://pro.arcgis.com/en/pro-app/latest/tool-reference/cartography/smooth-polygon.htm),这自然会改变它们的边界边缘。但是如何平滑所有多边形......