如何将Pandas DataFrame中Year2列数据合并至Year1列并保留对应Total值生成独立行
解决Pandas DataFrame年份列合并问题
嘿,我来帮你搞定这个数据转换的需求!你想要把Year2列的年份合并到Year1列,同时让每个年份都对应原来的Total值,这里有两种实用的方法:
方法一:使用melt函数(推荐,更简洁)
pd.melt是Pandas处理宽表转长表的常用工具,非常适合这种把多列年份合并成一列的场景,步骤如下:
import pandas as pd # 你的原始DataFrame df = pd.DataFrame({ 'Year1': [2010, 2012, 2014], 'Year2': [2011, 2013, 2015], 'Total': [2500, 3000, 4000] }) # 用melt转换:保留Total列,把Year1和Year2转为行 result = df.melt( id_vars='Total', # 要保留的关联列 value_vars=['Year1', 'Year2'], # 需要转换为行的列 value_name='Year1' # 转换后的目标列名 ) # 移除自动生成的临时列,排序后重置索引 result = result.drop('variable', axis=1) result = result.sort_values('Year1').reset_index(drop=True) print(result)
运行后就能得到你想要的结果:
Total Year1 0 2500 2010 1 2500 2011 2 3000 2012 3 3000 2013 4 4000 2014 5 4000 2015
方法二:基于你已有的代码改进
你已经用np.repeat复制了行,接下来只需要把奇数行的Year1替换为Year2的值,再删掉Year2列即可:
import pandas as pd import numpy as np # 你的原始DataFrame df = pd.DataFrame({ 'Year1': [2010, 2012, 2014], 'Year2': [2011, 2013, 2015], 'Total': [2500, 3000, 4000] }) # 你已经完成的重复行步骤 df = pd.DataFrame(np.repeat(df.values, 2, axis=0)) df.columns = ['Year1', 'Year2', 'Total'] # 改进部分:把奇数索引行的Year1替换为Year2的值 df.loc[df.index % 2 == 1, 'Year1'] = df.loc[df.index % 2 == 1, 'Year2'] # 删除Year2列,重置索引 df = df.drop('Year2', axis=1).reset_index(drop=True) print(df)
这个方法完全基于你已有的尝试,通过定位重复后的奇数行(对应原Year2的年份),替换Year1的值,最终得到目标结构。
两种方法都能达到你的需求,推荐第一种melt的方式,代码更简洁易读,也更符合Pandas的惯用操作。
内容的提问来源于stack exchange,提问作者seevans38
相关产品推荐
相关产品推荐

