首页 > 解决方案 > 加入和分组 2 个数据帧

问题描述

我有 2 个数据框

df:ServicesA                         df:ServicesB
index      clientID    ServiceID_A  |  index    ClientID  ServiceID_B
0          A                 1      |  0          A           4
1          B                 2      |  1          B           5
2          C                 3      |  2          D           6
2          B                 4      |  

我想获得一个新的 df,在 df:ServicesB 上显示这些客户以及这些客户有多少 servicesA。这将是这样的

index    ClientID With ServiceID_B        count(ServiceID_A)
0                   A                             1
1                   B                             2
2                   D                             0

我试过这个:

我从 df:ServicesB 获得了一个唯一的客户端 ID 列表,并创建了一个名为“df”的新 df

df = pd.DataFrame(df_ServicesB['Client ID', ].unique(),columns=['Client ID'])

然后我使用这个 lambda 函数,它将从 df 获取每个客户端 ID 并遍历 df:ServicesA 计算那些具有数学的客户端 ID 的行(这相当于计算该数据帧上的 serviceidA

def getTotaldfServicesA(clientid):
  total_services = 0
  for index, row in df_ServicesA.iterrows():
    if row['ClientID'] == clientid:
      total_services += 1
  return total_services

df['Total_servicesA'] = df.apply(lambda row: getTotaldfServicesA(row['ClientID']),axis=1)

我“相信”这个公式有效,但我说“我相信”,因为从技术上讲,我没有看到结果 df,因为 df_ServicesA 是一个很长的迭代列表,而且 df_ServicesB 上的客户端数量也很长,使得迭代过程成倍增长lambda函数已经运行了几次,但要么失败而没有错误,要么在一夜之间超时,当我到达我的电脑查看结果时,我已经断开连接。目前它已经运行了 4 个小时,但我仍然没有得到结果 df 数据集/帧。

也许有一种更蟒蛇的方式来做到这一点?或者也许是一种让它更有效率的方法,所以它不会永远花费?

先感谢您

标签: pythonpandasdataframegoogle-colaboratory

解决方案


您可以对第一个数据框进行分组并计算组数:

# Assuming that df:ServicesA is df_a
grouped = df_a.groupby("clientID").count()
>>> grouped

        ServiceID_A
clientID    
       A    1
       B    2
       C    1

之后,您可以将第二个数据框留在外部加入与merge函数分组的第二个数据框:

# Assuming that df:ServicesB is df_b
joined = df_b[["ClientID"]].merge(grouped, left_on="ClientID",
                                  right_on="clientID", how="left").fillna(0)
>>> joined
    clientID    ServiceID_A
0          A            1.0
1          B            2.0
2          D            0.0

推荐阅读