如何根据同一数据框中具有特定条件的另一条记录更新一条记录的值

时间:2017-09-11 21:06:15

标签: python loops dataframe

在python中,我有一个像这样的GDP记录的数据框表

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%

也就是说,该值将根据其他记录的计算进行更新,但百分比保持不变。

是否有有效的方法来处理此案例。谢谢!

3 个答案:

答案 0 :(得分:1)

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%

答案 1 :(得分:1)

df.iloc[:-1, 1] = df['Vaule'].diff(-1)[:-1]
>>> df
     Quarter  Vaule percentage
0  2017Q1-Q4     40        18%
1  2017Q1-Q3     30        20%
2  2017Q1-Q2     20        15%
3  2017Q1-Q1      0        10%
4  2016Q1-Q4      4        28%
5  2016Q1-Q3      3        50%
6  2016Q1-Q2      2        45%
7  2016Q1-Q1      1        20%

答案 2 :(得分:0)

我想你需要这个:

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-','')

可重现的例子:

import pandas as pd
import numpy as np 
from StringIO import StringIO

data = """
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%
"""

df = pd.read_table(StringIO(data), sep="\s+")
df.loc[np.invert(df.Quarter.str.contains('Q1-Q1')), "Vaule"] = df["Vaule"] - df["Vaule"].shift(-1)
df.Quarter = df.Quarter.str.replace('Q1-','')

print(df)

输出:

  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解决方案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-','')