如何将所有公司值乘以“Total General”值,同时在 DataFrame 中保持“Total General”不变?

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

我有一个 Python 数据透视表,具有 以下结构

我想创建一个新的 DataFrame,其中:

所有公司(Amazon、Chedraui、Jüsto、Rappi、Uber)的价值乘以每年“总体总价值”的相应值。 “Total General”的值在生成的 DataFrame 中保持不变。 换句话说,新的 DataFrame 的“Total General”值应与原始 DataFrame 相同,并且所有其他公司值应按“Total General”值缩放。

这是我用来生成枢轴的当前代码:

import pandas as pd
import matplotlib.pyplot as plt
from rich import print
df = pd.read_csv('data_graf_som.csv')

def plot_som_charts(catcp_filter,mesesin):
    
    # Leer el archivo CSV
    df = pd.read_csv('data_graf_som.csv')

    # Filtrar los datos para los años 2023 y 2024, hasta junio
    df['Date'] = pd.to_datetime(df['Month.1'])
    df = df[(df['Year'] == 2023) & (df['Date'].dt.month <= mesesin) |
            (df['Year'] == 2024) & (df['Date'].dt.month <= mesesin)]
    df = df[df['CATCP'] == catcp_filter]  

    # Calcular el Year-to-Date (YTD) del SOM para cada año y compañía
    grouped = df.groupby(['Year', 'Company']).agg({
        ' CPUSD': 'sum',
        ' SalesCD': 'sum'
    }).reset_index()

    # Calcular el total general por año
    total_general = grouped.groupby('Year').agg({
        ' CPUSD': 'sum',
        ' SalesCD': 'sum'
    }).reset_index()
    total_general['Company'] = 'Total General'

    # Añadir la fila de total general al DataFrame de datos agrupados
    result = pd.concat([grouped, total_general], ignore_index=True)

    # Ordenar el DataFrame para que las filas de total general aparezcan al final de cada año
    result = result.sort_values(by=['Year', 'Company']).reset_index(drop=True)

    result['SOM'] = result[' CPUSD'] / result[' SalesCD']

    # Pivotar el DataFrame para que los años sean columnas
    pivot_df_year = result.pivot(index='Company', columns='Year', values='SOM')
    return pivot_df_year

df_2=plot_som_charts('TP',6)   

df_2

只是为了真正澄清我所看到的结果看起来像this

我试过这样:

import pandas as pd
import matplotlib.pyplot as plt
from rich import print
df = pd.read_csv('data_graf_som.csv')

def plot_som_charts(catcp_filter,mesesin):
    
    # Leer el archivo CSV
    df = pd.read_csv('data_graf_som.csv')

    # Filtrar los datos para los años 2023 y 2024, hasta junio
    df['Date'] = pd.to_datetime(df['Month.1'])
    df = df[(df['Year'] == 2023) & (df['Date'].dt.month <= mesesin) |
            (df['Year'] == 2024) & (df['Date'].dt.month <= mesesin)]
    df = df[df['CATCP'] == catcp_filter]  

    # Calcular el Year-to-Date (YTD) del SOM para cada año y compañía
    grouped = df.groupby(['Year', 'Company']).agg({
        ' CPUSD': 'sum',
        ' SalesCD': 'sum'
    }).reset_index()

    # Calcular el total general por año
    total_general = grouped.groupby('Year').agg({
        ' CPUSD': 'sum',
        ' SalesCD': 'sum'
    }).reset_index()
    total_general['Company'] = 'Total General'

    # Añadir la fila de total general al DataFrame de datos agrupados
    result = pd.concat([grouped, total_general], ignore_index=True)

    # Ordenar el DataFrame para que las filas de total general aparezcan al final de cada año
    result = result.sort_values(by=['Year', 'Company']).reset_index(drop=True)

    result['SOM'] = result[' CPUSD'] / result[' SalesCD']

    # Pivotar el DataFrame para que los años sean columnas
    pivot_df_year = result.pivot(index='Company', columns='Year', values='SOM')
    return pivot_df_year

df_2=plot_som_charts('TP',6)   

df_2

df_3 = pd.DataFrame(df_2).set_index('Year')

total_general = df_3.loc['Total General']

for col in df_3.columns:
    if col != 'Total General':
        df_3[col] = df_3[col] * total_general

df_3.loc['Total General'] = total_general

df_3

并收到此错误:KeyError:“列中没有['年份']”

我尝试了另一种方法,但将索引定义为公司并得到了类似的方法。

最后我检查了我的专栏并得到了这个:

*Index([2023, 2024], dtype='int64', name='年份') *

我想我看不到解决方案,即使我有这些年作为我的索引。我真的很感激这里的一些帮助:)

python pandas dataframe indexing pivot-table
1个回答
0
投票

如果不可视化 .csv 文件,就很难理解问题。但是,无论如何,让我尝试提供帮助。 在

concat
之前,请执行以下操作:

grouped=grouped.merge(total_general,on='Year')
grouped['SOM_times_total']=(grouped[' CPUSD_x']/grouped[' SalesCD_x'])*(grouped[' CPUSD_y']/grouped[' SalesCD_y'])

有关在 python pandas 中合并表的其他方法,请参阅此图片

© www.soinside.com 2019 - 2024. All rights reserved.