【问题标题】:How to update the value of one record based on another record with specific criteria in the same dataframes如何根据同一数据框中具有特定条件的另一条记录更新一条记录的值
【发布时间】:2017-09-11 21:06:15
【问题描述】:

在 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%

即根据其他记录的计算更新数值,但百分比保持不变。

有没有有效的方法来处理这种情况。谢谢!

【问题讨论】:

  • 该值如何计算,您尝试过什么?
  • 价值(2017Q4)=价值(2017Q1-Q4)-价值(2017Q1-Q3),价值(2017Q3)=价值(2017Q1-Q3)-价值(2017Q1-Q2),价值(2017Q1- Q2) = 价值(2017Q1-Q2) - 价值(2017Q1)。价值(2017Q1)=价值(2017Q1-Q1)

标签: python loops dataframe


【解决方案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%

【讨论】:

  • 谢谢,其他值是正确的,但对于 Q1,它不正确,因为值需要保持不变。例如。 Vaule(2017Q1-Q1) = 10 但不是 0。
  • @Harry 不确定我理解。 2017-Q1 = 10。您随后在2017Q1-Q1 中指的是哪个Q1?值不是本身,因此差异为零吗?
  • 不是Q1的差异,初始值为sum value,所以2017-Q1 = 2017Q1-Q1,与Q2/3/4不同。
【解决方案2】:

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%

【讨论】:

  • 谢谢,其他值是正确的,但对于 Q1,它不正确,因为值需要保持不变。例如。 Vaule(2017Q1-Q1) = 10 但不是 0。
【解决方案3】:

我猜你需要这个:

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

【讨论】:

  • 谢谢,其他值是正确的,但对于 Q1,它不正确,因为值需要保持不变。例如。 Vaule(2017Q1-Q1) = 10 但不是 0。
猜你喜欢
  • 2019-09-30
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
  • 2020-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多