如何使用Pandas将DataFrame中的列值转换为列标题、原列标题转换为单列值?
Pandas DataFrame 格式转换解决方案
嘿,作为Pandas新手能想到用melt、pivot这些方法已经很棒啦!这个转换其实可以通过**melt(宽转长)+ pivot(长转宽)**的组合来实现,我给你一步步拆解:
首先,先把你的示例数据用Pandas创建出来(方便你直接测试):
import pandas as pd # 创建原始DataFrame df = pd.DataFrame({ "大学编号(University id #)": [1, 1, 1], "年份(Year)": [2022, 2022, 2022], "财务要素(fin_element)": ["element #1", "element #2", "element #3"], "上年(prior_year)": ["$1", "$3", "$2"], "本年(current_year)": ["$2", "$5", "$0"] })
第一步:用melt把「上年」「本年」转成「财务期间」列
这一步是把原来的宽表(有prior_year和current_year两个列)转成长表,让每个期间变成单独的行:
# 执行melt操作 melted_df = df.melt( id_vars=["大学编号(University id #)", "年份(Year)", "财务要素(fin_element)"], value_vars=["上年(prior_year)", "本年(current_year)"], var_name="财务期间(financial_period)", value_name="金额" ) # 把期间列的名称简化成你要的prior_year/current_year melted_df["财务期间(financial_period)"] = melted_df["财务期间(financial_period)"].str.split("(").str[1].str.split(")").str[0]
执行完这一步,你会得到一个长格式的DataFrame,每一行对应「大学+年份+财务要素+期间+金额」的组合。
第二步:用pivot把「财务要素」转成列
现在我们要把纵向的财务要素变成横向的列,就用pivot:
# 执行pivot操作 result_df = melted_df.pivot( index=["大学编号(University id #)", "年份(Year)", "财务期间(financial_period)"], columns="财务要素(fin_element)", values="金额" ).reset_index() # 去掉列名的层级(因为pivot后列会有个层级名,这里不需要) result_df.columns.name = None
最终结果
运行完上面的代码,result_df就是你想要的格式啦:
| 大学编号(University id #) | 年份(Year) | 财务期间(financial_period) | element #1 | element #2 | element #3 |
|---|---|---|---|---|---|
| 1 | 2022 | prior_year | $1 | $3 | $2 |
| 1 | 2022 | current_year | $2 | $5 | $0 |
逻辑总结
简单来说就是两步:
- 先把横向的期间列转成纵向的行(melt),这样每个期间都能单独成为一行记录
- 再把纵向的财务要素转成横向的列(pivot),让每个要素成为一个独立的列
这样组合起来就完美匹配你的需求啦,你可以把自己的真实数据替换进去测试哦~
内容的提问来源于stack exchange,提问作者nullmonies
相关产品推荐
相关产品推荐

