我有一个数据框df
,如下所示,大约有200列:
Date Run_1 Run_295 Prc
2/1/2020 3
2/2/2020 2 6
2/3/2020 5 2
我只想在列Prc
不为Nan或非空时才从列Run_1 Run_295 Run_300
中减去列Date Run_1 Run_295
2/1/2020
2/2/2020 -4
2/3/2020 3
,以获得以下信息:
import pandas as pd
from io import StringIO
s = """Date,Run_1,Run_295,Prc
2/1/2020,,,3
2/2/2020,2,,6
2/3/2020,,5,2"""
df = pd.read_csv(StringIO(s))
print(df)
我不确定如何继续执行上述操作。
用于重现数据帧的代码:
{{1}}
答案 0 :(得分:1)
三个步骤,melt
取消显示数据框
然后loc
处理分配任务
&GroupBy
重新制作原始df。
确保有更好的方法,但这可以避免循环和apply
cols = df.columns
s = pd.melt(df,id_vars=['Date','Prc'],value_name='Run Rate')
s.loc[s['Run Rate'].isnull()==False,'Run Rate'] = s['Run Rate'] - s['Prc']
df_new = s.groupby([s["Date"], s["Prc"], s["variable"]])["Run Rate"].first().unstack(-1)
print(df_new[cols])
variable Date Run_1 Run_295 Prc
0 2/1/2020 NaN NaN 3
1 2/2/2020 -4.0 NaN 6
2 2/3/2020 NaN 3.0 2
答案 1 :(得分:0)
您可以简单地减去它。它正是您想要的:
df.Run_1-df.Prc
这是输出的完整代码:
df.Run_1= df.Run_1-df.Prc
df.Run_295= df.Run_295-df.Prc
df.drop('Prc', axis=1, inplace=True)
df
Date Run_1 Run_295
0 2/1/2020 NaN NaN
1 2/2/2020 -4.0 NaN
2 2/3/2020 NaN 3.0