Pandas вычитать значения столбца, только если не нан - PullRequest
0 голосов
/ 30 января 2020

У меня есть фрейм данных df следующим образом с 200 столбцами:

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

Я хочу вычесть столбец Prc из столбцов Run_1 Run_295 Run_300 только тогда, когда они не являются 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)

Ответы [ 2 ]

1 голос
/ 30 января 2020

Три шага, 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
0 голосов
/ 30 января 2020

Вы можете просто вычесть это. Это именно то, что вы хотите:

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
...