我想将元素转换为单列。我尝试过数据透视表和数据透视表,因为我有重复项,所以它不允许,我也尝试过融化
大学 ID # | 年份 | 财务周期 | 元素#1 | 元素#2 | 元素#3 |
---|---|---|---|---|---|
1 | 2022 | 前一年 | 1 美元 | 3 美元 | 2 美元 |
1 | 2022 | 当前_年份 | 2 美元 | 5 美元 | 0 美元 |
这就是我想要得到的
大学 ID # | 年份 | fin_element | 前一年 | 当前_年份 |
---|---|---|---|---|
1 | 2022 | 元素#1 | 1 美元 | 2 美元 |
1 | 2022 | 元素#2 | 3 美元 | 5 美元 |
1 | 2022 | 元素#3 | 2 美元 | 0 美元 |
我已经尝试过了
df_melt = df.melt(id_vars=df.columns[:2], value_vars='element')
将元素移动到列中,但我不知道如何将财务周期转换为列标题
.set_index()
、unstack()
(旋转 financial_period
)和 .stack()
(旋转 fin_element
)以及一些额外的修饰来解决此问题。
(
df
.set_index(['University id #', 'Year', 'financial_period'])
.rename_axis('fin_element', axis=1)
.unstack('financial_period')
.stack('fin_element')
.sort_index(axis=1, ascending=False)
.rename_axis(None, axis=1)
.reset_index()
)
University id # Year fin_element prior_year current_year
0 1 2022 element #1 $1 $2
1 1 2022 element #2 $3 $5
2 1 2022 element #3 $2 $0
此类技术也包含在如何旋转数据框?(过于广泛的规范问题)。另请参阅用户指南:重塑和数据透视表。
拆垛后
fin_element element #1 element #2 element #3
financial_period current_year prior_year current_year prior_year current_year prior_year
University id # Year
1 2022 $2 $1 $5 $3 $0 $2
堆叠排序后
financial_period prior_year current_year
University id # Year fin_element
1 2022 element #1 $1 $2
element #2 $3 $5
element #3 $2 $0
我使用了melt和pivot来获得输出
df_melted = df.melt(
id_vars=['University id #', 'Year', 'financial_period'],
value_vars=['element #1', 'element #2', 'element #3'],
var_name='fin_element',
value_name='value')
# Pivot the 'financial_period' column to make each period a new column
df_pivoted = df_melted.pivot_table(
index=['University id #', 'Year', 'fin_element'],
columns='financial_period',
values='value',
aggfunc='first').reset_index()
# Flatten the columns
df_pivoted.columns.name = None # Remove the columns' name
df_pivoted = df_pivoted.rename_axis(None, axis=1) # Remove the index name
print(df_pivoted)
输出:
University id # Year fin_element current_year prior_year
0 1 2022 element #1 $2 $1
1 1 2022 element #2 $5 $3
2 1 2022 element #3 $0 $2
设置参考:
import pandas as pd
data = {
'University id #': [1, 1],
'Year': [2022, 2022],
'financial_period': ['prior_year', 'current_year'],
'element #1': ['$1', '$2'],
'element #2': ['$3', '$5'],
'element #3': ['$2', '$0'],
}
df = pd.DataFrame(data)
或者,我们可以使用
pd.wide_to_long
进行一些重塑:
pd.wide_to_long(df, 'element', ['University id #', 'Year', 'financial_period'], 'fin_element', suffix='.*')['element']\
.rename(lambda x: 'element'+x, level=3).unstack(2).reset_index()
输出:
financial_period University id # Year fin_element current_year prior_year
0 1 2022 element #1 $2 $1
1 1 2022 element #2 $5 $3
2 1 2022 element #3 $0 $2