python - 加入和分组 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 数据集/帧。
也许有一种更蟒蛇的方式来做到这一点?或者也许是一种让它更有效率的方法,所以它不会永远花费?
先感谢您
解决方案
您可以对第一个数据框进行分组并计算组数:
# 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
推荐阅读
- javascript - 我想找到集群之间的中心点
- html - 无法从本地文件系统下载 xml 文件
- swift - 异步等待“表达式类型不明确,没有更多上下文”错误 - 在 swiftUI 中
- php - 如何处理冬夏时节
- reactjs - 自定义 Material UI 动画持续时间
- docker - 使用 Docker Desktop 和 WSL2 时,我的卷安装在哪里?
- php - 选择查询以选择 2 个表
- android - 在连接更改时,AsyncTask 会加载不完整的图像
- laravel - 在 cypress.json 中动态设置 baseUrl
- r - 我怎样才能进入看起来像这样的 API 内容?