我有一个 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='年份') *
我想我看不到解决方案,即使我有这些年作为我的索引。我真的很感激这里的一些帮助:)
如果不可视化 .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 中合并表的其他方法,请参阅此图片。