Python 在列上减去列,避免数据帧中包含字符串

Python 在列上减去列,避免数据帧中包含字符串,python,pandas,Python,Pandas,我有以下数据框,每个季度都有累积结果,并重置为1°Q 我需要四分之一的净变化,所以我需要在一列上减去一列,除了那些有1°Q的 from pandas import DataFrame data = {'Financials': ['EPS','Earnings','Sales','Margin'], '1°Q19': [1,2,3,4], '2°Q19': [2,4,6,8], '3°Q19': [3,6,9,12], '4°Q

我有以下数据框,每个季度都有累积结果,并重置为1°Q

我需要四分之一的净变化,所以我需要在一列上减去一列,除了那些有1°Q的

from pandas import DataFrame

data = {'Financials': ['EPS','Earnings','Sales','Margin'],
        '1°Q19': [1,2,3,4],
        '2°Q19': [2,4,6,8], 
        '3°Q19': [3,6,9,12],
        '4°Q19': [4,8,12,16],
        '1°Q20': [1,2,3,4],
        '2°Q20': [2,4,6,8],
        '3°Q20': [3,6,9,12],
        '4°Q20': [4,8,12,16]
        }

df = DataFrame(data,columns=['Financials','1°Q19','2°Q19','3°Q19','4°Q19',
                             '1°Q20','2°Q20','3°Q20','4°Q20'])
print(df)

  Financials  1°Q19  2°Q19  3°Q19  4°Q19  1°Q20  2°Q20  3°Q20  4°Q20
0        EPS      1      2      3      4      1      2      3      4
1   Earnings      2      4      6      8      2      4      6      8
2      Sales      3      6      9     12      3      6      9     12
3     Margin      4      8     12     16      4      8     12     16
我是这样开始的,然后我陷入了困境:

if ~df.columns.str.contains('1°Q'):
#    here I want to substract (1°Q remains unchanged), 2°Q - 1°Q, 3°Q - 2°Q, 4°Q - 3°Q
为了获得所需的结果:

  Financials  1°Q19  2°Q19  3°Q19  4°Q19  1°Q20  2°Q20  3°Q20  4°Q20
0        EPS  1.0    1.0    1.0    1.0    1.0    1.0    1.0    1.0
1   Earnings  2.0    2.0    2.0    2.0    2.0    2.0    2.0    2.0
2      Sales  3.0    3.0    3.0    3.0    3.0    3.0    3.0    3.0
3     Margin  4.0    4.0    4.0    4.0    4.0    4.0    4.0    4.0
我试过了

new_df = df.diff(axis=1).fillna(df)
print(new_df)
但这种情况下的结果不是de 1°Q20的理想结果:

  Financials  1°Q19  2°Q19  3°Q19  4°Q19  1°Q20  2°Q20  3°Q20  4°Q20
0        EPS    1.0    1.0    1.0    1.0   -3.0    1.0    1.0    1.0
1   Earnings    2.0    2.0    2.0    2.0   -6.0    2.0    2.0    2.0
2      Sales    3.0    3.0    3.0    3.0   -9.0    3.0    3.0    3.0
3     Margin    4.0    4.0    4.0    4.0  -12.0    4.0    4.0    4.0
您可以利用df.shift进行减法运算,并使用fillna修复移位后留下的NaN值

df=df.set_index('Financials')

df-(df.shift(1, axis=1).fillna(0))

            1°Q 2°Q 3°Q 4°Q
Financials              
EPS         1.0 1.0 1.0 1.0
Earnings    2.0 2.0 2.0 2.0
Sales       3.0 3.0 3.0 3.0
Margin      4.0 4.0 4.0 4.0
您可以利用df.shift进行减法运算,并使用fillna修复移位后留下的NaN值

df=df.set_index('Financials')

df-(df.shift(1, axis=1).fillna(0))

            1°Q 2°Q 3°Q 4°Q
Financials              
EPS         1.0 1.0 1.0 1.0
Earnings    2.0 2.0 2.0 2.0
Sales       3.0 3.0 3.0 3.0
Margin      4.0 4.0 4.0 4.0
IIUC,轴=1,然后用

预期产出:

new_df = new_df.astype(int) 
编辑

IIUC,轴=1,然后用

预期产出:

new_df = new_df.astype(int) 
编辑


此处设置索引不必要非常感谢您的回答,这只适用于一年,但当我有多年的时间时,它不起作用,因为我需要跳过1°Q。我在我的帖子中添加了一个编辑。此处设置索引不必要非常感谢您的回答,这只适用于一年,但是当我有多年的时间时,它不起作用,因为我需要跳过1°Q。我在我的帖子中添加了一个编辑。非常感谢你的回答,这在一年内效果很好,但是当我有多年的时间时,它不起作用,因为我需要跳过1°Q。我在我的帖子中添加了一个编辑。非常感谢你的回答,这只适用于一年,但当我有多年的时间时,它不起作用,因为我需要跳过1°Q。我已经在我的帖子中添加了一个编辑。
df.groupby(df.columns.str.contains('1°Q').cumsum(),axis=1).diff(axis=1).fillna(df)

  Financials  1°Q19  2°Q19  3°Q19  4°Q19  1°Q20  2°Q20  3°Q20  4°Q20
0        EPS    1.0    1.0    1.0    1.0    1.0    1.0    1.0    1.0
1   Earnings    2.0    2.0    2.0    2.0    2.0    2.0    2.0    2.0
2      Sales    3.0    3.0    3.0    3.0    3.0    3.0    3.0    3.0
3     Margin    4.0    4.0    4.0    4.0    4.0    4.0    4.0    4.0
df.diff(axis=1).T.mask(df.columns.to_series().str.contains('1°Q')).T.fillna(df)