ITPub博客

首页 > 应用开发 > IT综合 > 使用Python对两组数据进行纵向排序处理

使用Python对两组数据进行纵向排序处理

投稿 IT综合 作者:bhluo 时间:2025-12-18 17:19:25 0 删除 编辑

# 使用Python对两组数据进行纵向排序处理


在数据处理工作中,我们经常需要将两组或多组数据进行对齐排序,这种纵向排序在数据整合、对比分析等场景中尤为常见。Python凭借其强大的数据处理库,能够高效地完成这类任务。本文将介绍如何使用Python实现两组数据的纵向排序操作。


## 数据纵向排序的基本概念


纵向排序是指将两组或多组数据按照相同的顺序重新排列,确保它们之间的对应关系保持不变。这在处理时间序列数据、实验对照数据、多维度指标对比时特别重要。与单独排序每组数据不同,纵向排序的关键在于保持数据间的关联性。


## 准备示例数据


首先,让我们创建两组示例数据来演示排序过程:


```python

import pandas as pd

import numpy as np


# 创建第一组数据

data1 = {

    'ID': [101, 102, 103, 104, 105],

    '姓名': ['张三', '李四', '王五', '赵六', '钱七'],

    '成绩': [85, 92, 78, 88, 95]

}


# 创建第二组数据(与第一组部分ID对应,顺序不同)

data2 = {

    'ID': [104, 101, 103, 106, 102],

    '姓名': ['赵六', '张三', '王五', '孙八', '李四'],

    '年龄': [21, 19, 22, 20, 23]

}


df1 = pd.DataFrame(data1)

df2 = pd.DataFrame(data2)


print("第一组数据:")

print(df1)

print("\n第二组数据:")

print(df2)

```


## 基于共同标识符的纵向排序


当两组数据有共同的关键字段时,我们可以基于这个字段进行排序对齐:


```python

def sort_by_common_id(df1, df2, id_column='ID'):

    """

    基于共同ID对两个数据框进行纵向排序

    

    参数:

        df1: 第一个数据框

        df2: 第二个数据框

        id_column: 用作排序依据的列名

        

    返回:

        排序后的两个数据框

    """

    # 获取两组数据共有的ID

    common_ids = set(df1[id_column]) & set(df2[id_column])

    

    # 将共有ID转换为列表并排序

    sorted_ids = sorted(list(common_ids))

    

    # 按照排序后的ID重新排列数据

    df1_sorted = df1[df1[id_column].isin(sorted_ids)].sort_values(by=id_column)

    df2_sorted = df2[df2[id_column].isin(sorted_ids)].sort_values(by=id_column)

    

    # 重置索引

    df1_sorted = df1_sorted.reset_index(drop=True)

    df2_sorted = df2_sorted.reset_index(drop=True)

    

    return df1_sorted, df2_sorted


# 应用排序函数

df1_sorted, df2_sorted = sort_by_common_id(df1, df2)


print("排序后的第一组数据:")

print(df1_sorted)

print("\n排序后的第二组数据:")

print(df2_sorted)

```


## 处理缺失数据的纵向排序


实际工作中,两组数据可能存在不完全匹配的情况。以下方法可以处理这类情况:


```python

def vertical_sort_with_merge(df1, df2, key_column='ID', how='inner'):

    """

    使用合并操作实现纵向排序

    

    参数:

        df1: 左侧数据框

        df2: 右侧数据框

        key_column: 关键列名

        how: 合并方式 ('inner', 'outer', 'left', 'right')

        

    返回:

        排序合并后的数据框

    """

    # 为每个数据框添加原始位置标记

    df1 = df1.copy()

    df2 = df2.copy()

    

    # 执行合并操作

    merged_df = pd.merge(df1, df2, how=how, suffixes=('_1', '_2'))

    

    # 按照关键列排序

    merged_df = merged_df.sort_values(by=key_column).reset_index(drop=True)

    

    return merged_df


# 使用不同合并方式

inner_merged = vertical_sort_with_merge(df1, df2, how='inner')

outer_merged = vertical_sort_with_merge(df1, df2, how='outer')


print("内连接合并结果(只保留共有ID):")

print(inner_merged)

print("\n外连接合并结果(保留所有ID):")

print(outer_merged)

```


## 多维数据的纵向排序


当排序依据涉及多个字段时,我们需要更复杂的方法:


```python

def multi_column_vertical_sort(df1, df2, sort_columns):

www.tv.zizhitong.cn>www.hy.zizhitong.cn>www.gd.zhongfangtec.com

    """

    基于多列进行纵向排序

    

    参数:

        df1: 第一个数据框

        df2: 第二个数据框

        sort_columns: 排序依据的列名列表

        

    返回:

        排序后的数据框

    """

    # 添加来源标记

    df1['数据来源'] = '第一组'

    df2['数据来源'] = '第二组'

    

    # 合并数据

    combined = pd.concat([df1, df2], ignore_index=True)

    

    # 按照指定列排序

    combined_sorted = combined.sort_values(by=sort_columns).reset_index(drop=True)

    

    return combined_sorted


# 创建包含多列的数据示例

multi_data1 = pd.DataFrame({

    '部门': ['销售部', '销售部', '技术部', '技术部', '人事部'],

    '姓名': ['张三', '李四', '王五', '赵六', '钱七'],

    '绩效': [85, 92, 78, 88, 95]

})


multi_data2 = pd.DataFrame({

    '部门': ['技术部', '销售部', '销售部', '人事部', '技术部'],

    '姓名': ['赵六', '张三', '李四', '钱七', '孙八'],

    '工龄': [3, 1, 2, 5, 4]

})


# 按部门和姓名排序

result = multi_column_vertical_sort(multi_data1, multi_data2, ['部门', '姓名'])

print("按部门和姓名纵向排序的结果:")

print(result)

```


## 自定义排序规则的实现


有时我们需要根据特定业务规则进行排序:


```python

def custom_vertical_sort(df1, df2, sort_key_func):

    """

    使用自定义函数进行纵向排序

    

    参数:

        df1: 第一个数据框

        df2: 第二个数据框

        sort_key_func: 生成排序键的函数

        

    返回:

        排序后的数据框

    """

    # 为每个数据框计算排序键

    df1 = df1.copy()

    df2 = df2.copy()

    

    df1['排序键'] = df1.apply(sort_key_func, axis=1)

    df2['排序键'] = df2.apply(sort_key_func, axis=1)

    

    # 合并并排序

    combined = pd.concat([df1, df2], ignore_index=True)

    combined_sorted = combined.sort_values(by='排序键').reset_index(drop=True)

    

    # 移除临时列

    combined_sorted = combined_sorted.drop(columns=['排序键'])

    

    return combined_sorted


# 定义自定义排序函数

def composite_key(row):

    """创建复合排序键:部门优先级 + 姓名"""

    dept_priority = {'销售部': 1, '技术部': 2, '人事部': 3}

    return f"{dept_priority.get(row.get('部门', ''), 99):02d}_{row.get('姓名', '')}"


# 应用自定义排序

custom_sorted = custom_vertical_sort(multi_data1, multi_data2, composite_key)

print("按自定义规则排序的结果:")

print(custom_sorted)

www.tu.zhongfangtec.com>

```


## 性能优化建议


处理大规模数据时,排序性能变得尤为重要:


```python

def efficient_vertical_sort(df1, df2, key_column):

    """

    高效纵向排序实现,适用于大数据集

    

    参数:

        df1: 第一个数据框

        df2: 第二个数据框

        key_column: 关键列名

        

    返回:

        排序后的数据框

    """

    # 使用索引提高性能

    df1_indexed = df1.set_index(key_column)

    df2_indexed = df2.set_index(key_column)

    

    # 获取排序后的共同键

    common_keys = sorted(set(df1_indexed.index) & set(df2_indexed.index))

    

    # 使用索引选择数据,提高效率

    df1_sorted = df1_indexed.loc[common_keys].reset_index()

    df2_sorted = df2_indexed.loc[common_keys].reset_index()

    

    return df1_sorted, df2_sorted


# 生成大规模测试数据

np.random.seed(42)

large_data1 = pd.DataFrame({

    'ID': range(10000),

    '数值': np.random.randn(10000)

})www.kw.zhongfangtec.com


large_data2 = pd.DataFrame({

    'ID': np.random.permutation(10000),

    '类别': np.random.choice(['A', 'B', 'C', 'D'], 10000)

})


# 测试性能

import time

start_time = time.time()

df1_fast, df2_fast = efficient_vertical_sort(large_data1, large_data2, 'ID')

end_time = time.time()


print(f"处理10000条数据的排序用时:{end_time - start_time:.4f}秒")

print(f"排序后数据形状:{df1_fast.shape}, {df2_fast.shape}")

```


## 应用场景与总结


数据纵向排序在多个领域有广泛应用:


1. **实验数据分析**:对齐实验组和对照组数据

2. **时间序列处理**:同步不同频率的时间序列

3. **数据库整合**:合并来自不同来源的数据表

4. **特征工程**:对齐特征数据和标签数据


通过本文介绍的方法,我们可以根据具体需求选择合适的数据纵向排序策略。简单的基于共同标识符的排序适用于数据完整且结构一致的情况;合并操作提供了处理缺失数据的灵活性;多维排序和自定义排序则能应对更复杂的业务需求。


Python的pandas库为这些操作提供了强大支持,结合适当的性能优化技巧,即使是处理大规模数据集,也能保持较高的执行效率。在实际应用中,根据数据特性和处理目标选择合适的方法,能够显著提高数据处理的准确性和效率。


掌握数据纵向排序技术,能够帮助我们更好地整合和分析多源数据,为后续的数据挖掘和决策支持打下坚实基础。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/19545/viewspace-3105632/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2015-11-01

  • 博文量
    895
  • 访问量
    933968