我有一个包含各种项目季度值的图表,我需要创建一个列,显示每个项目上一年的季度值(例如:项目A的2021_Q1值将与2020_Q1进行比较,其他项目依此类推)。
下面是我的复制品。
df = pd.DataFrame({'item':['A','A','A','A','A','A','B','B','B','B','B','B','C','C','C','C','C','C'],
'quarter':['FY20_Q1','FY20_Q2','FY20_Q3','FY20_Q4','FY21_Q1','FY21_Q2',
'FY20_Q1','FY20_Q2','FY20_Q3','FY20_Q4','FY21_Q1','FY21_Q2',
'FY20_Q1','FY20_Q2','FY20_Q3','FY20_Q4','FY21_Q1','FY21_Q2'],
'value':[100,150,120,135,128,160,230,210,240,220,250,230,125,230,162,111,134,135]})
字符串
我对值进行了排序,并使用了groupby
和shift
,但我没有得到想要的结果。
df['value_prev'] = df.sort_values(by=['item','quarter']).groupby(['item'])['value'].shift()
型
这给了我下面的结果,这显然是比较前一季度的价值,而不是一年。
item quarter value value_prev
0 A FY20_Q1 100 NaN
1 A FY20_Q2 150 100
2 A FY20_Q3 120 150
3 A FY20_Q4 135 120
4 A FY21_Q1 128 135
5 A FY21_Q2 160 128
...
型
我的预期结果如下。有没有什么方法可以用来得到这个。
item quarter value value_prev
0 A FY20_Q1 100 NaN
1 A FY20_Q2 150 NaN
2 A FY20_Q3 120 NaN
3 A FY20_Q4 135 NaN
4 A FY21_Q1 128 100
5 A FY21_Q2 160 150
型
3条答案
按热度按时间vyu0f0g11#
尝试:
字符串
印刷品:
型
m3eecexj2#
你正面临着一个挑战,因为你的“季度”列实际上包含两条信息.季度和年度。
让我们将该列分解,构建一个数据透视表,这样就可以做任何需要的分析了,而且在某些记录丢失的情况下,这也保证不起作用。
第一步:将复杂的列分成两个(这里的代码适用于你的虚拟数据--也许你所有的生产数据都需要一个更复杂的处理异常的函数。但是你必须把这两个维度分开!)
字符串
第二步:让我们将年份和季度重新排列成行和列(这显然是2个不同的维度,您希望运行不同的分析,例如,比较季度与季度将是行操作,而比较年份与年份将是列操作)-请仅对1个产品或所有产品执行此操作
型
第3步:选择你现在想做的任何分析。比如说,对于所有产品,看看几年来“Q1”的“价值”:
型
5uzkadbs3#
另一种可能的解决方案是提取年份并减去1,用减去的年份列创建一个新的嵌套框(
d
),与初始嵌套框(df
)合并以获得与调整后的年份对应的值,最后,将d
的value
列添加为df
的value_prev
列:字符串
输出量:
型