【问题标题】:Pandas subtract column values only when non nan熊猫仅在非 nan 时减去列值
【发布时间】:2020-05-16 10:44:07
【问题描述】:

我有一个数据框df 如下,大约有 200 列:

Date        Run_1   Run_295 Prc
2/1/2020                    3
2/2/2020    2               6
2/3/2020            5       2

我想从列Run_1 Run_295 Run_300 中减去列Prc,只有当它们是非Nan 或非空时,才能得到以下结果:

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)

【问题讨论】:

  • 您是否总是希望减去最后一列,并且始终将日期列作为您要执行此操作的第一列?
  • 不,我有列名,所以 Prc 是需要减去的名称
  • 你可以试试:m = df.set_index('Date') 然后final = m.drop('Prc',1).sub(m['Prc'],axis=0).reset_index() 吗?

标签: pandas python-3.5


【解决方案1】:

你可以简单地减去它。它完全符合您的要求:

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

【讨论】:

  • 我有 100 列。我不能这样做
  • 但是您可以循环执行此操作。
【解决方案2】:

三个步骤,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

【讨论】:

    猜你喜欢
    • 2017-03-31
    • 2020-10-08
    • 1970-01-01
    • 2019-02-05
    • 1970-01-01
    • 1970-01-01
    • 2020-01-05
    • 2013-12-10
    相关资源
    最近更新 更多