Python 在列上减去列,避免数据帧中包含字符串
我有以下数据框,每个季度都有累积结果,并重置为1°Q 我需要四分之一的净变化,所以我需要在一列上减去一列,除了那些有1°Q的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
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)