如何按Node分组为DataFrame的Links列填充递增字母序列?
问题:按节点分组循环填充字母序列
需求
按顺序填充“Links”列的字母(A、B、C……),直到“Node”值发生变化(或“NewNode”为True)时重新从A开始。
尝试的代码
import pandas as pd import numpy as np import string data = {'Node': ['Node_1', 'Node_1','Node_1','Node_1','Node_2','Node_2','Node_2']} df = pd.DataFrame(data=data) l=list(string.ascii_uppercase) def link_def(x): a = 0 if x == 'True': l[0] else: a = a+1 l[a] return l[a] df['NewNode'] = np.where(df['Node'].shift() != df['Node'],True,"") df['Links'] = df['NewNode'].apply(lambda row : link_def(row))
当前输出
Node NewNode Links 0 Node_1 True A 1 Node_1 B 2 Node_1 B 3 Node_1 B 4 Node_2 True A 5 Node_2 B 6 Node_2 B
期望输出
Node NewNode Links 0 Node_1 True A 1 Node_1 B 2 Node_1 C 3 Node_1 D 4 Node_2 True A 5 Node_2 B 6 Node_2 C
解决方案
你之前的代码问题在于link_def函数里的变量a是局部变量,每次调用都会重置为0,导致只能循环取A和B。正确的做法是按Node分组后,给每组内的行分配连续索引,再映射到字母表:
import pandas as pd import numpy as np import string data = {'Node': ['Node_1', 'Node_1','Node_1','Node_1','Node_2','Node_2','Node_2']} df = pd.DataFrame(data=data) # 保留原需求的NewNode列标记 df['NewNode'] = np.where(df['Node'].shift() != df['Node'], True, "") # 按Node分组,计算组内行的递增索引,映射为对应字母 df['Links'] = df.groupby('Node').cumcount().map(lambda idx: string.ascii_uppercase[idx])
代码说明
groupby('Node'):将数据按节点分组,确保每个节点的序列独立计数cumcount():为每组内的行生成从0开始的连续整数(比如Node_1组得到[0,1,2,3],Node_2组得到[0,1,2])map(...):将整数索引对应到大写字母表,0对应A、1对应B,以此类推
运行后就能得到你想要的输出结果。
内容的提问来源于stack exchange,提问作者Umutcan S
相关产品推荐
相关产品推荐

