在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%
也就是说,该值将根据其他记录的计算进行更新,但百分比保持不变。
是否有有效的方法来处理此案例。谢谢!
答案 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-','')