如何在Pandas中生成有序数字的combined_id列且保留原列顺序
解决方案
要实现让combined_id列按数字从小到大排列拼接,同时保留Student1和Student2原列顺序,可按以下步骤操作:
步骤1:提取用户ID中的数字部分
从Student1和Student2的字符串中提取出USER后的数字,转成整数用于比较大小。
步骤2:按数字大小排序拼接
对每行的两个数字进行比较,将数字较小的对应的完整id/USERxxx放在前面,数字较大的对应的USERxxx放在后面(保持与原combined_id一致的拼接格式)。
完整代码实现
import pandas as pd # 构造示例数据 data = { 'Student1': ['id/USER321', 'id/USER123', 'id/USER439', 'id/USER999'], 'Student2': ['id/USER329', 'id/USER123', 'id/USER122', 'id/USER333'], 'combined_id': ['id/USER321_USER329', 'id/USER123_USER123', 'id/USER439_USER122', 'id/USER999_USER333'] } df = pd.DataFrame(data) # 定义生成排序后combined_id的函数 def get_sorted_combined(s1, s2): # 提取数字并转整数 num1 = int(s1.split('/')[-1].replace('USER', '')) num2 = int(s2.split('/')[-1].replace('USER', '')) # 按数字大小拼接 if num1 <= num2: return f"{s1}_{s2.split('/')[-1]}" else: return f"{s2}_{s1.split('/')[-1]}" # 应用函数更新combined_id列 df['combined_id'] = df.apply(lambda row: get_sorted_combined(row['Student1'], row['Student2']), axis=1) print(df)
运行结果
执行后得到的DataFrame与期望结果完全一致:
Student1 Student2 combined_id 0 id/USER321 id/USER329 id/USER321_USER329 1 id/USER123 id/USER123 id/USER123_USER123 2 id/USER439 id/USER122 id/USER122_USER439 3 id/USER999 id/USER333 id/USER333_USER999
注意事项
- 如果你的
combined_id需要拼接完整的id/USERxxx格式(比如id/USER122_id/USER439),只需修改函数中的拼接逻辑为return f"{s2}_{s1}"即可。 - 该方法不会修改
Student1和Student2列的任何内容,完全保留原有顺序。
内容的提问来源于stack exchange,提问作者youtube
相关产品推荐
相关产品推荐

