如何基于n列复制特定行并反转数据框中的机场代码
实现方法
以下提供两种常用的实现方案,分别适用于Python数据处理和数据库场景:
方案一:Python Pandas
假设你的数据已经加载为Pandas DataFrame,执行以下步骤即可完成需求:
import pandas as pd # 1. 构造原数据集(如果是从文件读取,用pd.read_csv/pd.read_excel即可) data = { 'ID': [1, 2, 3, 4], 'departure_airport': ['ZRH', 'ZRH', 'MSY', 'VIE'], 'arrival_airport': ['BUD', 'MSY', 'IAD', 'ZRH'], 'n': [1, 2, 2, 1] } df = pd.DataFrame(data) # 2. 筛选n=2的行,交换出发/到达机场代码 reversed_rows = df[df['n'] == 2].copy() reversed_rows[['departure_airport', 'arrival_airport']] = reversed_rows[['arrival_airport', 'departure_airport']].values # 3. 标记原行与反转行,用于排序 df['is_original'] = 1 reversed_rows['is_original'] = 0 # 4. 合并数据并排序,确保原行在前,对应反转行在后 combined = pd.concat([df, reversed_rows], ignore_index=True) combined.sort_values(by=['ID', 'is_original'], ascending=[True, False], inplace=True) # 5. 重新生成连续的ID,并清理临时列 combined['ID'] = range(1, len(combined) + 1) combined.drop('is_original', axis=1, inplace=True) # 查看结果 print(combined.to_string(index=False))
执行后会输出你期望的结果:原行保留,n=2的行对应反转行紧跟其后,ID连续递增。
方案二:SQL
假设数据存储在名为flights的数据库表中,使用以下SQL语句可以直接生成目标结果:
SELECT ROW_NUMBER() OVER (ORDER BY original_id, is_original DESC) AS ID, departure_airport, arrival_airport, n FROM ( -- 保留所有原行 SELECT ID AS original_id, departure_airport, arrival_airport, n, 1 AS is_original FROM flights UNION ALL -- 生成n=2行的反转版本 SELECT ID AS original_id, arrival_airport AS departure_airport, departure_airport AS arrival_airport, n, 0 AS is_original FROM flights WHERE n = 2 ) AS combined_data ORDER BY ID;
这个语句通过UNION ALL合并原行和反转行,再用ROW_NUMBER()生成连续的ID,排序逻辑保证原行在前,反转行紧随对应的原行之后。
内容的提问来源于stack exchange,提问作者sdiv
相关产品推荐
相关产品推荐

