Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何基于同一数据帧中具有特定条件的另一条记录更新一条记录的值_Python_Loops_Dataframe - Fatal编程技术网

Python 如何基于同一数据帧中具有特定条件的另一条记录更新一条记录的值

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

在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    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 solution
df.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-','')