从原始数据帧执行计算和新数据帧

时间:2021-07-08 04:08:36

标签: python pandas numpy

我有一个大型数据框 df,我想在其中执行计算并从中创建新字段。

数据

l_re date_re val_re id_re    u_re pos_re  l_d date_d val_d  id_d      u_d
c    q321   10      c_q321_1  ok   160    c   q321   20    c_q321_1   hi
c    q321   20      c_q321_2  cool 160    c   q321   10    c_q321_2   hi
b    q321   5       b_q321_1  sure 50     NaN NaN    NaN   NaN        NaN           
NaN  NaN    NaN     NaN       NaN  NaN    c   q422   5     c_q422_1   red
NaN NaN     NaN     NaN       NaN  NaN    c   q422   15    c_q422_2   blue

需要

lo  date    consumed    retro   final   space
c   q321    30          30      0       160
b   q321    5           0       5       49

  1. 我正在尝试按 l_re 和 date_re 分组,然后对 val_re 求和并创建一个“已消耗”列,然后对 val_d 求和并创建一个“retro”列(按 l_d 和 date_d 分组)

  2. 我也在尝试创建一个“final”列,然后从新创建的“retro”列中减去新创建的“consumed”

  3. 最后,我尝试按 pos_re、l_re 和 date_re 分组,并从 pos_re 中减去 id_re 的计数并添加id_d 的计数。这是“空格”列

对于“c”,“id_re”有 2 次计数,“id_d”有 2 次计数

对于'b','id_re'有1个计数,'id_d'有0个计数

第 3 步示例

(160 - 2) + 2 = 160

(50 - 1) + 0 = 49

      step1 = df.groupby(['l_re','date_re']).agg({'val_re': 'sum'})
      step2 = df['final'] = df['consumed'] - df['retro'].astype(int)


      step3 = df['space'] = df.groupby(['pos_re', 'l_re', 'date_re']).transform('sum')

              df['space'] = (df['pos_re'] - df['id_re'] + df['id_d'])

第 3 步涉及减法和加法

我能够单独执行一些转换,但不确定如何将所有步骤顺利合并在一起。任何建议表示赞赏

2 个答案:

答案 0 :(得分:2)

IIUC:

import pandas as pd
d = {'params':["a", "b", "c"], 'value':[1,2,3]} 
df =  pd.DataFrame(data = d) 
def f(x):
    d = {'consumed': [x['val_re'].sum()],
         'retro': [x['val_d'].sum()],
         'final': [x['val_re'].sum() - x['val_d'].sum()],
         'space': [x['pos_re'].mean() - x['id_re'].count() + x['id_d'].count()]}
    return pd.DataFrame(d)

答案 1 :(得分:1)

第三步不清楚

s=df.groupby(['l_re','date_re']).agg(consumed =('val_re','sum'),retro =('val_d','sum')).reset_index()
s['final']=s['consumed'].sub(s['retro'])