如何在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
相关产品推荐
相关产品推荐

