我有一个大型数据框 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
做
我正在尝试按 l_re 和 date_re 分组,然后对 val_re 求和并创建一个“已消耗”列,然后对 val_d 求和并创建一个“retro”列(按 l_d 和 date_d 分组)
我也在尝试创建一个“final”列,然后从新创建的“retro”列中减去新创建的“consumed”
最后,我尝试按 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 步涉及减法和加法
我能够单独执行一些转换,但不确定如何将所有步骤顺利合并在一起。任何建议表示赞赏
答案 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'])