Python 如何基于同一数据帧中具有特定条件的另一条记录更新一条记录的值
在python中,我有一个GDP记录的dataframes表,如下所示Python 如何基于同一数据帧中具有特定条件的另一条记录更新一条记录的值,python,loops,dataframe,Python,Loops,Dataframe,在python中,我有一个GDP记录的dataframes表,如下所示 Quarter Vaule percentage 2017Q1-Q4 100 18% 2017Q1-Q3 60 20% 2017Q1-Q2 30 15% 2017Q1-Q1 10 10% 2016Q1-Q4 10 28% 2016Q1-Q3 6 50% 2016Q1-Q2 3 45% 2016Q1-Q1 1 20% 我希望输出如下: Quarter
Quarter Vaule percentage
2017Q1-Q4 100 18%
2017Q1-Q3 60 20%
2017Q1-Q2 30 15%
2017Q1-Q1 10 10%
2016Q1-Q4 10 28%
2016Q1-Q3 6 50%
2016Q1-Q2 3 45%
2016Q1-Q1 1 20%
我希望输出如下:
Quarter Vaule percentage
2017Q4 40 18%
2017Q3 30 20%
2017Q2 20 15%
2017Q1 10 10%
2016Q4 4 28%
2016Q3 3 50%
2016Q2 2 45%
2016Q1 1 20%
也就是说,该值将根据其他记录的计算进行更新,但百分比保持不变
有没有有效的方法来处理这个案件。谢谢 IIUC:
In [20]: df.loc[~df.Quarter.str.contains(r'\d+Q1-Q1'), 'Vaule'] = df.Vaule.diff(-1)
In [21]: df
Out[21]:
Quarter Vaule percentage
0 2017Q1-Q4 40.0 18%
1 2017Q1-Q3 30.0 20%
2 2017Q1-Q2 20.0 15%
3 2017Q1-Q1 10.0 10%
4 2016Q1-Q4 4.0 28%
5 2016Q1-Q3 3.0 50%
6 2016Q1-Q2 2.0 45%
7 2016Q1-Q1 1.0 20%
如果您还需要更改季度:
In [22]: df.Quarter = df.Quarter.str.split('-').str[0]
In [23]: df
Out[23]:
Quarter Vaule percentage
0 2017Q4 40.0 18%
1 2017Q3 30.0 20%
2 2017Q2 20.0 15%
3 2017Q1 10.0 10%
4 2016Q4 4.0 28%
5 2016Q3 3.0 50%
6 2016Q2 2.0 45%
7 2016Q1 1.0 20%
我想你需要这个:
import numpy as np
df.loc[np.invert(df.Quarter.str.contains('Q1-Q1')), "Vaule"] = df["Vaule"] - df["Vaule"].shift(-1)
df.Quarter = df.Quarter.str.replace('Q1-','')
一个可重复的例子:
输出:
Quarter Vaule percentage
0 2017Q4 40.0 18%
1 2017Q3 30.0 20%
2 2017Q2 20.0 15%
3 2017Q1 10.0 10%
4 2016Q4 4.0 28%
5 2016Q3 3.0 50%
6 2016Q2 2.0 45%
7 2016Q1 1.0 20%
PS:@MaxU solutiondf.Vaule=df.Vaule.diff(-1)
更简洁。考虑到这一点,代码将如下所示:
import numpy as np
df.loc[np.invert(df.Quarter.str.contains('Q1-Q1')), "Vaule"] = df.Vaule.diff(-1)
df.Quarter = df.Quarter.str.replace('Q1-','')
如何计算该值,您尝试过什么?值(2017Q4)=值(2017Q1-Q4)-值(2017Q1-Q3),值(2017Q3)=值(2017Q1-Q3)-值(2017Q1-Q2),值(2017Q1-Q2)=值(2017Q1-Q2)-值(2017Q1-Q2)-值(2017Q1)。值(2017Q1)=值(2017Q1-Q1)谢谢,其他值是正确的,但对于Q1,它不正确,因为值需要保持不变。例如Vaule(2017Q1-Q1)=10,但不是0。@Harry不确定我是否理解。2017-Q1=10。您随后在
2017Q1-Q1
中提到了哪个Q1
?值本身不是吗,因此差值为零?不是Q1的差值,初始值是和值,因此2017-Q1=2017Q1-Q1,与Q2/3/4不同。谢谢,其他值是正确的,但对于Q1它是不正确的,因为值需要保持不变。例如Vaule(2017Q1-Q1)=10,但不是0。谢谢,其他值是正确的,但对于Q1,它不正确,因为该值需要保持不变。例如Vaule(2017Q1-Q1)=10,但不是0。
Quarter Vaule percentage
0 2017Q4 40.0 18%
1 2017Q3 30.0 20%
2 2017Q2 20.0 15%
3 2017Q1 10.0 10%
4 2016Q4 4.0 28%
5 2016Q3 3.0 50%
6 2016Q2 2.0 45%
7 2016Q1 1.0 20%
import numpy as np
df.loc[np.invert(df.Quarter.str.contains('Q1-Q1')), "Vaule"] = df.Vaule.diff(-1)
df.Quarter = df.Quarter.str.replace('Q1-','')