熊猫仅在非nan时减去列值

时间:2020-01-30 18:36:13

标签: pandas python-3.5

我有一个数据框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}}

2 个答案:

答案 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