用 pandas 交换一列与标题的子集

问题描述 投票:0回答:3

我想将元素转换为单列。我尝试过数据透视表和数据透视表,因为我有重复项,所以它不允许,我也尝试过融化

大学 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')

将元素移动到列中,但我不知道如何将财务周期转换为列标题

python pandas pivot
3个回答
1
投票

您可以使用

.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

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)

0
投票

或者,我们可以使用

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
© www.soinside.com 2019 - 2024. All rights reserved.